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”为啥?

Gatsby graphiQL - 不能为不可为空的字段 ImageSharpFluid.src 返回 null

无法解析自定义对象 graphql 架构

Apollo/Graphql,Postgres - 为啥这个查询返回 null? [复制]