对于不可为空的字段不能 return null,调试器不显示 null
Cannot return null for non-nullable field , Debugger dosen't show 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,
}
},
})
},
})
我的问题是当我尝试用令牌 return 值改变登录方法时,它工作得很好,这是我的改变
mutation{
login(email :"dondala422@hotmail.com" password :"aa")
{
token
}
}
回应
{
"data": {
"login": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMyLCJpYXQiOjE1OTcxMDY0OTd9.d1Ra32ArCXumBfzg2vE1-xeea21cAkNwWBJPm3U3akM"
}
}
}
如图。这很有效。现在如前所述,AuthPayload return 令牌和用户类型
当我尝试与用户发生变异时:-
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的图片,在return值之前,定义了token和用户对象
VSCode Debugger picture
解析器中返回的对象包含一个名为 user
的 属性,但您的字段名为 users
。由于 users
未定义,它解析为 null
,但字段为 non-nullable,因此会引发错误。
我有这个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,
}
},
})
},
})
我的问题是当我尝试用令牌 return 值改变登录方法时,它工作得很好,这是我的改变
mutation{
login(email :"dondala422@hotmail.com" password :"aa")
{
token
}
}
回应
{
"data": {
"login": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjMyLCJpYXQiOjE1OTcxMDY0OTd9.d1Ra32ArCXumBfzg2vE1-xeea21cAkNwWBJPm3U3akM"
}
}
}
如图。这很有效。现在如前所述,AuthPayload return 令牌和用户类型 当我尝试与用户发生变异时:-
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的图片,在return值之前,定义了token和用户对象 VSCode Debugger picture
解析器中返回的对象包含一个名为 user
的 属性,但您的字段名为 users
。由于 users
未定义,它解析为 null
,但字段为 non-nullable,因此会引发错误。