graphql - 无法为不可为空的字段返回 null,调试器不显示 null
问题描述
我有这个 schema.graphql
### This file was generated by Nexus Schema
### Do not make changes to this file directly
type AuthPayload {
token: String!
users: users!
}
scalar DateTime
type Mutation {
login(email: String, password: String): AuthPayload!
signup(CREATED_BY: String, EMAIL: String, FIRST_NAME: String, IS_ACTIVE: Boolean, PASSWORD: String, USERNAME: String): AuthPayload!
}
type Query {
me: users
}
type users {
CREATED_BY: String!
CREATED_ON: DateTime
EMAIL: String!
FIRST_NAME: String!
id: Int!
IS_ACTIVE: Boolean!
LAST_NAME: String
MODIFIED_BY: String
MODIFIED_ON: DateTime
ORGANIZATION_ID: String
PASSWORD: String!
PHONE: String
USERNAME: String!
}
突变:-
const Mutation = mutationType({
definition(t) {
t.field('signup', {
type: 'AuthPayload',
args: {
FIRST_NAME: stringArg({ nullable: true }),
EMAIL: stringArg(),
PASSWORD: stringArg(),
IS_ACTIVE: booleanArg(),
USERNAME: stringArg(),
CREATED_BY: stringArg(),
},
resolve: async (parent, { FIRST_NAME, EMAIL, PASSWORD ,IS_ACTIVE ,USERNAME,CREATED_BY }, ctx) => {
const hashedPassword = await hash(PASSWORD, 10)
const user = await ctx.prisma.users.create({
data: {
FIRST_NAME,
EMAIL,
PASSWORD: hashedPassword,
IS_ACTIVE,
USERNAME,
CREATED_BY
},
})
return {
token: sign({ userId: user.id }, APP_SECRET),
user,
}
},
})
t.field('login', {
type: 'AuthPayload',
args: {
email: stringArg(),
password: stringArg(),
},
resolve: async (parent, { email, password }, context) => {
const user = await context.prisma.users.findOne({
where: {
EMAIL : email,
},
})
if (!user) {
return new Error(`No user found for email: ${email}`)
}
const passwordValid = await compare(password, user.PASSWORD)
if (!passwordValid) {
return new Error('Invalid password')
}
const token = await sign({ userId: user.id }, APP_SECRET)
return {
token ,
user,
}
},
})
},
})
我的问题是当我尝试使用令牌返回值改变登录方法时,它工作得很好,这是我的突变
mutation{
login(email :"dondala422@hotmail.com" password :"aa")
{
token
}
}
回复
{
"data": {
"login": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMyLCJpYXQiOjE1OTcxMDY0OTd9.d1Ra32ArCXumBfzg2vE1-xeea21cAkNwWBJPm3U3akM"
}
}
}
如图所示 。这完美地工作。现在如前所述,当我尝试与用户发生变异时,AuthPayload 返回令牌和用户类型:-
mutation{
login(email :"dondala422@hotmail.com" password :"aa")
{
token
users{
USERNAME
FIRST_NAME
}
}
}
它给了我这个错误
{
"errors": [
{
"message": "Cannot return null for non-nullable field AuthPayload.users.",
"locations": [
{
"line": 4,
"column": 5
}
],
"path": [
"login",
"users"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"stacktrace": [
"Error: Cannot return null for non-nullable field AuthPayload.users.",
" at completeValue (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:595:13)",
" at completeValueCatchingError (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:530:19)",
" at resolveField (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:461:10)",
" at executeFields (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:297:18)",
" at collectAndExecuteSubfields (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:748:10)",
" at completeObjectValue (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:738:10)",
" at completeValue (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:626:12)",
" at completeValue (C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:592:21)",
" at C:\\Users\\donda\\Desktop\\New folder (3)\\prisma-examples\\javascript\\graphql-auth - Copy\\node_modules\\graphql\\execution\\execute.js:527:16"
]
}
}
}
],
"data": null
}
我试图附加调试器以查看 null 出现在哪里,但我没有找到任何可为 null 的值
这是vscode返回值前的图片,token和user对象都是定义的 VSCode调试器图片
解决方案
解析器中返回的对象包含一个名为 的属性user
,但您的字段名为users
。由于users
未定义,因此解析为null
,但该字段不可为空,因此会引发错误。
推荐阅读
- react-native - 如何解决gradle包含太多目录
- wordpress - 从 httrack 上传 wordpress 主题下载的任何可能方式?
- c# - static extern void Buffer.InternalBlockCopy 是 .NET Framework 的一部分吗?
- javascript - 如果条件在 javascript 中不起作用,当从文本框调用时
- android - Hyperledger Iroha Android - CommandService Stateless 无效 tx - 格式错误的 creator_account_id,传递值:'' -
- java - 了解构造函数的有界泛型参数
- java - 如果 readCount 为零,如何跳过 itemWriter
- hadoop - HRegionServer 启动错误
- google-chrome - 在 Chrome 中,我可以阻止 Google 搜索结果中的视频和图像吗?
- pandas - 将熊猫数据框转换为 snap.py