ars*_*lan 7 graphql graphql-js
我正在使用graphql-tools。收到GraphQL查询后,我使用ElasticSearch执行搜索并返回数据。
但是,通常所请求的查询仅包括一些可能的字段,而不是全部。我只想将请求的字段传递给ElasticSearch。首先,我需要获取请求的字段。
我已经可以将整个查询作为字符串获取。例如,在解析器中,
const resolvers = {
Query: {
async user(p, args, context) {
//can print query as following
console.log(context.query)
}
.....
}
}
Run Code Online (Sandbox Code Playgroud)
它打印为
query User { user(id:"111") { id name address } }
Run Code Online (Sandbox Code Playgroud)
有没有办法以以下格式获取请求的字段
{ id:"", name:"", address:"" }
Run Code Online (Sandbox Code Playgroud)
在graphql-js中,解析器提供了第四个参数称为resolve info。该字段包含有关该字段的更多信息。
从GraphQL docs GraphQLObjectType config参数类型定义:
// See below about resolver functions.
type GraphQLFieldResolveFn = (
source?: any,
args?: {[argName: string]: any},
context?: any,
info?: GraphQLResolveInfo
) => any
type GraphQLResolveInfo = {
fieldName: string,
fieldNodes: Array<Field>,
returnType: GraphQLOutputType,
parentType: GraphQLCompositeType,
schema: GraphQLSchema,
fragments: { [fragmentName: string]: FragmentDefinition },
rootValue: any,
operation: OperationDefinition,
variableValues: { [variableName: string]: any },
}
Run Code Online (Sandbox Code Playgroud)
在该fieldNodes字段中,您可以搜索您的字段并获取selectionSet特定字段的。从这里开始,它变得很棘手,因为selections可以是常规字段选择,片段或内联片段。您必须将所有这些合并,才能知道在一个字段上选择的所有字段。
info在解析器中有一个作为第4个参数传递的对象。此参数包含您要查找的信息。
使用库graphql-fields可以帮助您解析graphql查询数据:
const graphqlFields = require('graphql-fields');
const resolvers = {
Query: {
async user(_, args, context, info) {
const topLevelFields = graphqlFields(info);
console.log(Object.keys(topLevelFields)); // ['id', 'name', 'address']
},
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4416 次 |
| 最近记录: |