[英]In GraphQL, how do I implement optional queries?
编辑:由于目前尚不清楚,我特别在问有关数据库请求的信息,我应该在用于查询后端的resolve函数中提出该数据库请求。
我正在实现GraphQL查询,并且在确切了解我应该在给定查询中进行多少次调用时遇到了麻烦。 例如,这是一个包含用户和俱乐部的数据结构,用户可以加入该俱乐部:
User {
UserID
Clubs
OtherStuff
}
Club{
ClubID
ClubName
}
我可以对数据库进行以下调用:
我不明白的是,是否应该在每次查询用户时都拨打所有这些电话。 如果某人仅查询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:UserType定义。
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
UserID: {
type: GraphQLID
},
Clubs: {
type: new GraphQLList(ClubType)
}
})
});
GraphQL具有延迟加载功能,可处理查询中的其他字段。 如果用户编写以下查询:
query{
users{
id
}
}
它获取用户ID,并且显然不会寻找其他字段。 当然,这绝对取决于您的解析器。 如果您编写的解析器是这样的: users { resolve: body => get_user_id}
,它将从数据库中获取用户ID。 希望这可以帮助!
GraphQL API按照类型和字段进行组织,我建议为用户类型和俱乐部类型创建单独的查询,如果有人仅查询userId,则他们将使用用户查询。
查询用户:
query {
users {
id
}
}
查询俱乐部:
query {
club {
clubID
clubName
userId
}
}
如果有人试图查询用户/俱乐部,则可以将俱乐部类型添加到用户类型中,如下所示:
query {
users {
id
club {
clubID
clubName
}
}
}
在您的用户类型中,将有一个名为club的字段,它将是club类型,而在解析器中,它将使用obj.userId
作为参数来调用club查询, obj.userId
的优点在于,您可以让客户端决定要取。
您可以在此处看到嵌套查询的示例
编辑:然后在您的情况下,您可以修改userType以包括该用户所属的俱乐部,您不需要在clubQueryField
该条件,该条件将取决于客户clubQueryField
在执行的查询,所以可以说您的用户类型是:
用户类型:
export default new GraphQLObjectType({
name: 'UserType',
fields: {
userId: {
description: 'user id',
type: GraphQLString
},
email: {
description: 'user email',
type: GraphQLString
},
clubs: {
description: 'User clubs',
type: new GraphQLList(ClubType),
resolve: (obj, args, _) => {
return getUserClubs(obj.userId);
}
},
}
});
然后,如果您的客户仅需要用户,它将请求以下内容:
query {
User {
userId
email
}
}
如果客户需要用户和俱乐部,它将请求以下内容:
query {
User {
userId
email
clubs {
field1
field2
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.