GraphQL 将参数传递给子解析
Posted
技术标签:
【中文标题】GraphQL 将参数传递给子解析【英文标题】:GraphQL pass args to sub resolve 【发布时间】:2017-02-05 12:45:45 【问题描述】:我在用户和帖子之间有关系。这就是我查询用户帖子的方式。
const UserType = new GraphQLObjectType(
name: 'User'
fields: () => (
name:
type: GraphQLString
,
posts:
type: new GraphQLList(PostType),
resolve(parent, args , db )
// I want to get here the args.someBooleanArg
return someLogicToGetUserPosts();
)
);
主要查询是:
const queryType = new GraphQLObjectType(
name: 'RootQuery',
fields:
users:
type: new GraphQLList(UserType),
args:
id:
type: GraphQLInt
,
someBooleanArg:
type: GraphQLInt
,
resolve: (root, id, someBooleanArg , db ) =>
return someLogicToGetUsers();
);
问题是 UserType 帖子的解析函数中的 args 是空对象,我如何将主查询中的 args 传递给子解析函数?
【问题讨论】:
【参考方案1】:解析根查询时,您可以使用 object assign 将参数附加到返回的用户对象。 然后,在用户类型上,从根值(resolve 函数的第一个参数)解析参数。
例子:
const queryType = new GraphQLObjectType(
name: 'RootQuery',
fields:
users:
type: new GraphQLList(UserType),
args:
id:
type: GraphQLInt
,
someBooleanArg:
type: GraphQLInt
,
resolve: (root, id, someBooleanArg , db ) =>
return Promise.resolve(someLogicToGetUsers()).then(v =>
return Object.assign(, v,
someBooleanArg
);
);
);
const UserType = new GraphQLObjectType(
name: 'User'
fields: () => (
name:
type: GraphQLString
,
posts:
type: new GraphQLList(PostType),
resolve(parent, args , db )
console.log(parent.someBooleanArg);
return someLogicToGetUserPosts();
)
);
【讨论】:
是否没有本地方式将其作为“args”传递给子查询而不是更改响应对象?【参考方案2】:您可以使用解析器的第四个参数 info
来接收所需的变量 - 来自 Apollo 文档:
GraphQL.js 架构中的每个解析器都接受四个位置参数:
fieldName(obj, args, context, info) 结果
这些论点有 以下含义和常规名称:
obj:包含解析器返回结果的对象 父字段,或者在***查询字段的情况下, 从服务器配置传递的 rootValue。这个论点使 GraphQL 查询的嵌套性质。
args:具有 参数传递到查询中的字段。例如,如果 使用作者(名称:“Ada”)调用字段,args 对象将是: “名称”:“艾达”。
context:这是所有解析器共享的对象 一个特定的查询,用于包含每个请求的状态, 包括身份验证信息、数据加载器实例和 解决问题时应考虑的任何其他事项 询问。如果您使用的是 Apollo Server,请阅读有关如何设置 设置文档中的上下文。
info:这个参数应该只 在高级情况下使用,但它包含有关 查询的执行状态,包括字段名、路径 从根字段,等等。它仅记录在 GraphQL.js 源代码。
info
似乎是一个非常无证的功能,但我现在使用它没有任何问题(至少在有人决定更改它之前)。
这是诀窍:
const UserType = new GraphQLObjectType(
name: 'User'
fields: () => (
name:
type: GraphQLString
,
posts:
type: new GraphQLList(PostType),
resolve(parent, args , db , info)
// I want to get here the args.someBooleanArg
console.log("BINGO!");
console.log(info.variableValues.someBooleanArg);
return someLogicToGetUserPosts();
)
);
【讨论】:
这不正确,该字段的args
与您查询的variables
不同。你可以有,例如 ``` query($variableId: ID) user(id: $variableId) posts // 这里你得到信息。 variableValues.variableId,而不是用户 args.id ```
这只适用于命名的变量,如果你使用硬编码的变量,它们不会出现以上是关于GraphQL 将参数传递给子解析的主要内容,如果未能解决你的问题,请参考以下文章