Apollo GraphQL“不能为不可为空的字段 Mutation.createUser 返回 null”
Posted
技术标签:
【中文标题】Apollo GraphQL“不能为不可为空的字段 Mutation.createUser 返回 null”【英文标题】:Apollo GraphQL "Cannot return null for non-nullable field Mutation.createUser" 【发布时间】:2019-10-25 13:10:39 【问题描述】:我知道这是一个比较常见的问题,但我的实现与其他帖子不同。我正在使用我无法工作的最基本的实现。我使用 Sequelize 和 mysql 作为数据库实现。
解析器.js
const resolvers =
Query:
async getStudent (root, id , models )
return models.User.findByPk(id)
,
,
Mutation:
async createUser (root, name, email , models )
return models.User.create(
name,
email
)
,
,
schema.js
const gql = require('apollo-server-express');
const typeDefs = gql`
type User
id: Int!
name: String!
email: String!
type Query
getUser(id: Int!): User
getAllUsers: [User!]!
type Mutation
createUser(name: String!, email: String!): User!
`
module.exports = typeDefs;
用户模型
'use strict';
module.exports = (sequelize, DataTypes) =>
const User = sequelize.define('User',
name: DataTypes.STRING,
email: DataTypes.STRING
, );
User.associate = function(models)
// associations can be defined here
;
return User;
;
当运行以下突变时:
mutation createUser(name:"Nate", email:"nate@test.com") 编号
我收到:
“错误”:[ "message": "不能为不可为空的字段 Mutation.createUser 返回 null。", “地点”:[ “线”:2, “列”:3 ], “小路”: [ “创建用户” ],
【问题讨论】:
同样的斗争。很难找出解决方案。 在我的例子中,我没有在模型创建之前包含 await,例如:return await models.User.create(name,email) 你为什么使用突变而不是查询? 因为创建用户是一种变异(数据正在变异)而不是查询。 【参考方案1】:在我的情况下,这是因为 createUser 调用不是异步的。希望这可以帮助某人:
return models.User.create(
name,
email
)
【讨论】:
【参考方案2】:就我而言,这是架构中指定的内容与解析器返回的内容之间的类型不匹配:架构指定了单个 User
(不正确),但解析器返回了 [User!]!
【讨论】:
【参考方案3】:您可以简单地在字段之后删除!
,例如,它们可以是null
type User
id: ID!
name: String
email: String
created_at: DateTime!
updated_at: DateTime!
【讨论】:
【参考方案4】:我的回答不会针对这个问题,但我认为这可能会对某人有所帮助,因为我自己也遇到了这个问题并且很难找出解决方案。某些键用于 sequelize 中的关联,并且当您打算检索该类型时,应该在 graphql 中使用该键。
例如,Orders 属于 orderStatuses,用于此的键是 status
在我的情况下,如第 56 行
并且确切地说这个status
应该在orders.graphql
中使用Order
类型,如第12行所示
【讨论】:
【参考方案5】:这个错误是因为你的解析器没有返回任何有效的用户对象。只需 console.log() createUser 解析器来检查它返回的内容。那么你就可以追查问题的原因了
【讨论】:
【参考方案6】:我有同样的错误。就我而言,问题是我从type-graphl
导入@Mutation
而不是@nestjs/graphql
。
【讨论】:
以上是关于Apollo GraphQL“不能为不可为空的字段 Mutation.createUser 返回 null”的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL 查询返回错误“不能为不可为空的字段返回 null”
AWS放大graphql突变:不能为不可为空的字段返回null
Schema graphql 错误给出“不能为不可为空的字段 Organisation.id 返回 null”为啥?