如何将变量附加到 Graphql 上下文?
Posted
技术标签:
【中文标题】如何将变量附加到 Graphql 上下文?【英文标题】:How to attach variables to the Graphql context? 【发布时间】:2021-08-04 01:53:30 【问题描述】:我正在使用 express-graphql。 我想将一些参数附加到上下文中,但它们没有附加。
中间件:
app.use(graphqlHTTP(
schema: schema,
rootValue: resolver,
graphiql: true,
context: someValue: 100
))
架构:
type Query
get_number: Int!
解析器:
get_number(_, __, context)
console.log(context);
return context.someValue;
当我尝试调用 get_number 时,它会说:
"errors": [
"message": "Cannot return null for non-nullable field Query.get_number.",
"locations": [
"line": 2,
"column": 2
],
"path": [
"get_number"
]
],
"data": null
console.log(context) 是这样说的:
fieldName: 'get_number',
fieldNodes: [
kind: 'Field',
alias: undefined,
name: [Object],
arguments: [],
directives: [],
selectionSet: undefined,
loc: [Object]
],
returnType: Int!,
parentType: Query,
path: prev: undefined, key: 'get_number' ,
schema: GraphQLSchema
__validationErrors: [],
__allowedLegacyNames: [],
_queryType: Query,
_mutationType: Mutation,
_subscriptionType: undefined,
_directives: [ @skip, @include, @deprecated ],
astNode: undefined,
extensionASTNodes: undefined,
_typeMap: [Object: null prototype]
Query: Query,
TestType: TestType,
Int: Int,
User: User,
String: String,
Float: Float,
ClassMatein: ClassMatein,
ClassMate: ClassMate,
Mutation: Mutation,
UserInput: UserInput,
__Schema: __Schema,
__Type: __Type,
__TypeKind: __TypeKind,
Boolean: Boolean,
__Field: __Field,
__InputValue: __InputValue,
__EnumValue: __EnumValue,
__Directive: __Directive,
__DirectiveLocation: __DirectiveLocation
,
_possibleTypeMap: [Object: null prototype] ,
_implementations: [Object: null prototype]
,
fragments: [Object: null prototype] ,
rootValue:
test: [Function: test],
random: [Function: random],
addTestUser: [Function: addTestUser],
get_mate: [Function: get_mate],
get_number: [Function: get_number]
,
operation:
kind: 'OperationDefinition',
operation: 'query',
name: undefined,
variableDefinitions: [],
directives: [],
selectionSet: kind: 'SelectionSet', selections: [Array], loc: [Object] ,
loc: start: 0, end: 21
,
variableValues:
我的架构:
const
buildSchema
= require('graphql')
const gql = require('graphql-tag');
module.exports = buildSchema(`
type User
name: String!
email: String!
age: Int!
我猜我的 someValue 应该在 variableValues 中,但它不存在:( 我应该怎么做才能将此变量(someValue)附加到上下文中? 提前致谢。
【问题讨论】:
你能澄清“他们不附加”吗?你的意思是代码原样不起作用?它会抛出错误吗?如果是这样,错误是什么? 看起来应该可以了。你从console.log
得到什么输出?
@Bergi 我已经添加了输出和记录的上下文。你能看一下吗:)
@loganfsmyth 我添加了一些关于我的问题的更多信息。你能看一下吗:)
看起来您的实际代码正在记录第四个参数 (resolveInfo
),而不是第三个 (context
)。
【参考方案1】:
问题是您将resolvers
对象作为rootValue
传递。相反,您应该将它们放在您的架构中,例如使用makeExecutableSchema
。
解析器接受四个参数:父对象、字段参数、上下文和解析信息。
如果架构中的字段没有解析器,GraphQL 会退回到简单地使用父对象上的字段名称访问属性(对于根 Query
类型的字段,它是 rootValue
)。如果属性是一个方法,它会使用三个参数调用该方法(即this
= 父对象):字段参数、上下文和解析信息。
【讨论】:
非常感谢!你太棒了:)以上是关于如何将变量附加到 Graphql 上下文?的主要内容,如果未能解决你的问题,请参考以下文章