Node.js GraphQL字段未定义
从GraphQL/Node/Express/Typescript堆栈开始,我遇到了一个问题,字段参数没有传递给解析器函数。我有两个问题: 用户列表:Node.js GraphQL字段未定义,node.js,graphql,graphql-js,Node.js,Graphql,Graphql Js,从GraphQL/Node/Express/Typescript堆栈开始,我遇到了一个问题,字段参数没有传递给解析器函数。我有两个问题: 用户列表: UserList: { type: new GraphQLList(UserType), args: { userName: { type: GraphQLString }, userIsLocked: {
UserList: {
type: new GraphQLList(UserType),
args: {
userName: {
type: GraphQLString
},
userIsLocked: {
type: GraphQLBoolean
},
userIsConfirmed: {
type: GraphQLBoolean
},
userAwaitingPassword: {
type: GraphQLBoolean
}
},
resolve: ((_, {fields}) => new User().where({fields}))
}
和用户:
User: {
type: UserType,
args: {
userId: {
type: GraphQLID
}
},
resolve: ((_, {userId}) => new User().getById({userId}))
}
User().where()
函数默认显示未提供条件的所有用户。但是,请考虑下面的查询和结果:
query All {
UserList(userIsLocked:true){
userId
userName
userIsLocked
}
}
// Results
{
"data": {
"UserList": [
{
"userId": "a4f1d968-52d6-4148-bf62-1e132a4defde",
"userName": "user1",
"userIsLocked": false
},
{
"userId": "b42a1170-096a-11e9-b568-0800200c9a66",
"userName": "administrator",
"userIsLocked": false
}
]
}
}
显然,userIsLocked没有在where()
函数上传递fields参数。然而,以下工作:
query Individual {
User(userId: "a4f1d968-52d6-4148-bf62-1e132a4defde") {
userId
userName
userIsLocked
}
}
// Results
{
"data": {
"User": {
"userId": "a4f1d968-52d6-4148-bf62-1e132a4defde",
"userName": "user1",
"userIsLocked": false
}
}
}
当
userId
登录到对getById()
的请求时,我在控制台中看到{“userId”:“a4f1d968-52d6-4148-bf62-1e132a4defde”}
。但是当字段
登录到where()
请求时,控制台中显示的所有内容都是未定义的
,我的查询默认显示所有用户。我不明白为什么两个显然相等的查询会以如此不同的方式运行。我已经浏览了GraphQL的文档,但我能找到的只是示例查询和一般查询结构 传递给resolve
函数的第二个参数是一个对象,其属性映射到该字段的参数。让我们看看正在工作的解析器:
resolve: (_, {userId}) => new User().getById({userId})
在这里,您使用从第二个参数解包userId
属性,并将其签名到同名变量。然后使用创建一个具有userId
属性的对象(使用定义的userId
变量的值),并将此对象传递给getById
方法
这在语法上等同于以下函数:
resolve: (_, args) => {
const userId = args.userId
return new User().getById({ userId: userId })
}
resolve: (_, {fields}) => new User().where({fields})
您的问题不清楚您使用的是什么ORM,因此我无法说明您是否正确调用了其他解析器中的where
方法。但是,您肯定没有解压缩该字段的任何参数。以下是您的功能:
resolve: (_, args) => {
const userId = args.userId
return new User().getById({ userId: userId })
}
resolve: (_, {fields}) => new User().where({fields})
这相当于:
resolve: (_, args) => {
const fields = args.fields
return new User().where({ fields: fields })
}
您的字段有以下四个参数:userName
、userIsLocked
、userisconfirm
和userwaitingpassword
<代码>字段不是有效的参数,因此将始终未定义,除非将名为字段的参数添加到用户列表
字段并实际传入。我冒昧猜测一下,你的模型也没有字段
属性。如果只想将arguments对象传递给where
方法,可以执行以下操作:
resolve: (_, fields) => new User().where(fields)
注意缺少花括号。同样,您还没有告诉我们您正在使用什么ORM或用户模型本身,因此如果您没有正确使用该API,这仍然可能无法提供所需的结果。然而,希望这能让你走上正轨。就是这样。拆下支架后,我看到它实际上是在用这些键馈送对象。