从GraphQL / Node / Express / Typescript堆栈开始,我遇到了一个问题,其中字段参数未传递到解析器函数。我有两个查询:
UserList:
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
}
]
}
}
很显然,没有在where()
函数上传递usersIsLocked的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"}
。但是,当fields
登录到对where()
的请求时,控制台中显示的全部为undefined
,而我的查询默认为显示所有用户。我无法弄清楚为什么两个明显相等的查询将以这种不同的方式表现。我已经搜索了GraphQL的文档,但是我只能找到示例查询和常规查询结构。
答案 0 :(得分:2)
传递给resolve
函数的第二个参数是一个对象,该对象的属性映射到该字段的参数。让我们看一下运行中的解析器:
resolve: (_, {userId}) => new User().getById({userId})
在这里,您正在使用object destructuring syntax从第二个参数中解压缩userId
属性,并将其签名为同名变量。然后,您使用shorthand property name syntax创建一个具有userId
属性(具有您定义的userId
变量的值)的对象,并将该对象传递给getById
方法。 / p>
这在语法上等效于以下功能:
resolve: (_, args) => {
const userId = args.userId
return new User().getById({ userId: userId })
}
从您的问题中不清楚您正在使用什么ORM,因此我无法确定您是否在其他解析器中正确调用了where
方法。但是,您绝对不会解压缩该字段的任何参数。这是您的功能:
resolve: (_, {fields}) => new User().where({fields})
等同于:
resolve: (_, args) => {
const fields = args.fields
return new User().where({ fields: fields })
}
您的字段具有以下四个参数:userName
,userIsLocked
,userIsConfirmed
和userAwaitingPassword
。 fields
不是有效的参数,因此除非您将一个名为fields的参数添加到您的UserList
字段中并实际传递它,否则它将始终是不确定的。没有fields
属性。如果您只想将arguments对象传递给where
方法,则可以执行以下操作:
resolve: (_, fields) => new User().where(fields)
请注意缺少花括号。同样,您没有告诉我们您正在使用的ORM或用户模型本身的任何信息,因此,如果您没有正确使用 that API,这可能仍无法提供期望的结果。但是,希望这能使您走上正确的轨道。