【问题标题】:Apollo GraphQL "Cannot return null for non-nullable field Mutation.createUser"Apollo GraphQL“不能为不可为空的字段 Mutation.createUser 返回 null”
【发布时间】: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})
  • 你为什么使用突变而不是查询?
  • 因为创建用户是一种变异(数据正在变异)而不是查询。

标签: node.js graphql sequelize.js apollo-server


【解决方案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

            【讨论】:

              猜你喜欢
              • 2021-08-18
              • 2020-10-27
              • 2021-10-07
              • 2018-01-28
              • 2019-07-08
              • 2019-05-28
              • 2018-04-10
              • 2023-03-28
              • 2021-11-27
              相关资源
              最近更新 更多