GraphQL 字段未定义
GraphQL Fields Undefined
从 GraphQL/Node/Express/Typescript 堆栈开始,我遇到了一个问题,即字段参数未传递给解析器函数。我有两个问题:
用户列表:
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"}
。但是当 fields
被记录到对 where()
的请求时,控制台中显示的所有内容都是 undefined
并且我的查询默认显示所有用户。我不明白为什么 2 个明显相同的查询会以如此不同的方式表现。我已经搜索了 GraphQL 的文档,但我能找到的只是示例查询和一般查询结构。
传递给 resolve
函数的第二个参数是一个对象,其属性映射到该字段的参数。让我们看看工作解析器:
resolve: (_, {userId}) => new User().getById({userId})
在这里,您使用 object destructuring syntax to unpack the userId
property from the second parameter and sign it to a variable of the same name. You then use shorthand property name syntax 创建一个包含 userId
属性 的对象(使用您定义的 userId
变量的值)和此对象传递给 getById
方法。
这在语法上等同于以下函数:
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
属性。如果你只是想将参数对象传递给 where
方法,你可以这样做:
resolve: (_, fields) => new User().where(fields)
请注意缺少大括号。同样,您没有告诉我们您正在使用什么 ORM 或用户模型本身,因此如果您没有正确使用 that,这仍然可能无法为您提供所需的结果API。但是,希望这能让您走上正轨。
从 GraphQL/Node/Express/Typescript 堆栈开始,我遇到了一个问题,即字段参数未传递给解析器函数。我有两个问题:
用户列表:
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"}
。但是当 fields
被记录到对 where()
的请求时,控制台中显示的所有内容都是 undefined
并且我的查询默认显示所有用户。我不明白为什么 2 个明显相同的查询会以如此不同的方式表现。我已经搜索了 GraphQL 的文档,但我能找到的只是示例查询和一般查询结构。
传递给 resolve
函数的第二个参数是一个对象,其属性映射到该字段的参数。让我们看看工作解析器:
resolve: (_, {userId}) => new User().getById({userId})
在这里,您使用 object destructuring syntax to unpack the userId
property from the second parameter and sign it to a variable of the same name. You then use shorthand property name syntax 创建一个包含 userId
属性 的对象(使用您定义的 userId
变量的值)和此对象传递给 getById
方法。
这在语法上等同于以下函数:
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
属性。如果你只是想将参数对象传递给 where
方法,你可以这样做:
resolve: (_, fields) => new User().where(fields)
请注意缺少大括号。同样,您没有告诉我们您正在使用什么 ORM 或用户模型本身,因此如果您没有正确使用 that,这仍然可能无法为您提供所需的结果API。但是,希望这能让您走上正轨。