【发布时间】:2018-07-24 04:19:44
【问题描述】:
编辑:由于似乎不清楚,我特意询问我应该在解析函数中为后端查询发出的数据库请求。
我正在实现 GraphQL 查询,但我无法准确理解在给定查询中应该进行多少次调用。例如,这是一个包含用户和用户可以加入的俱乐部的数据结构:
User {
UserID
Clubs
OtherStuff
}
Club{
ClubID
ClubName
}
我可以对我的数据库进行以下调用:
- 获取所有用户 ID
- 获取 UserID 的信息
- 获取用户的所有 ClubID
- 获取 ClubID 的信息
我不明白的是,我是否应该在每次查询用户时都进行所有这些调用。如果某人只查询 UserID,那么检索其他所有内容似乎是一种巨大的浪费。 Clubs for User 应该是一个完全独立的 GraphQL 查询,Clubs 应该只返回 ClubID,还是有办法有效地允许 Clubs 字段中提供完整的 Club 信息?
编辑 2: 好的,这是我的代码。我已经评论了我不确定该怎么做的部分。
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
User: userQueryField,
Club: clubQueryField
}
});
const clubQueryField = {
type: new GraphQLList(ClubType),
args: {
UserID: {
description: 'Returns all clubs the user is a part of',
type: GraphQLID
}
},
resolve(root, {UserID}) {
//.....
}
};
const userQueryField = {
type: new GraphQLList(UserType),
args: {
UserID: {
description: 'If omitted, returns a list of all users. \
Otherwise, returns the user with the provided ID',
type: GraphQLID
}
},
resolve(root, {UserID}) {
if(UserID){
return new Promise((resolve, reject) => {
getUserInfo(UserID, function(response){
//HERE: I have tried different things, like clubQueryField(UserID) and clubQueryField.resolve, but with no luck
UserID.Clubs = clubQueryField
resolve([response]);
});
});
}
}
};
编辑 3:用户类型定义。
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
UserID: {
type: GraphQLID
},
Clubs: {
type: new GraphQLList(ClubType)
}
})
});
【问题讨论】:
-
这一切都在解析器中完成,接口方面,您传递解析器获取信息所需的信息。是的,解析器应该进行所有这些调用。当然,您可以使用缓存来加快速度。根据您的问题,我可以告诉您将 GraphQL 查询与后端查询混淆了。
-
我不认为我混淆了他们,但也许我的措辞不清楚。是什么让你觉得我在混淆他们?
-
措辞。 ;-)
-
USERTYPE 是在哪里定义的?您应该将数据发送到 USERTYPE,然后在那里解析。我不明白你为什么在解析器中写解析器。您提到了
type: new GraphQLList(UserType),但从未定义它。在 USERTYPE 模式中,您应该发回一组用户 ID。 -
@popctrl 很高兴它成功了!
标签: graphql graphql-js