【问题标题】:Sequelize and GraphQL resolvers non-nullable field [duplicate]Sequelize 和 GraphQL 解析器不可为空的字段 [重复]
【发布时间】:2020-05-23 12:29:30
【问题描述】:

我遇到了这个问题,我的解析器将返回一个错误,告诉我不可为空的字段为空,尽管我的数据库中显然有数据(因为我正在使用 sqlite 浏览器查看它)。这是因为它将为 player.id(或完全播放器对象)返回 null

所以我正在使用 graphql 的模型和模式,并希望返回一个特定的播放器,它有一个标志 (active = true)。我可以很好地返回 allPlayers 并获得所有玩家。但是在我的解析器中像这样过滤时:

async activePlayer(root, args, { models }) {
      return models.Player.findAll({ where: { active: true } });
}

我将收到空数据->因此在查询时发送错误:

{
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Player.id.",
      "locations": [
        {
          "line": 3,
          "column": 5
        }
      ],
      "path": [
        "activePlayer",
        "id"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "Error: Cannot return null for non-nullable field Player.id.",
            "    at completeValue (/usr/src/app/node_modules/graphql/execution/execute.js:560:13)",
            "    at completeValueCatchingError (/usr/src/app/node_modules/graphql/execution/execute.js:495:19)",
            "    at resolveField (/usr/src/app/node_modules/graphql/execution/execute.js:435:10)",
            "    at executeFields (/usr/src/app/node_modules/graphql/execution/execute.js:275:18)",
            "    at collectAndExecuteSubfields (/usr/src/app/node_modules/graphql/execution/execute.js:713:10)",
            "    at completeObjectValue (/usr/src/app/node_modules/graphql/execution/execute.js:703:10)",
            "    at completeValue (/usr/src/app/node_modules/graphql/execution/execute.js:591:12)",
            "    at /usr/src/app/node_modules/graphql/execution/execute.js:492:16",
            "    at async Promise.all (index 0)"
          ]
        }
      }
    }
  ],
  "data": {
    "activePlayer": null
  }
}

而在通过返回的承诺进行映射并在控制台记录它时,我会将所需的对象写入我的控制台:

  async activePlayer(root, args, { models }) {
      models.Player.findAll({ where: { active: true } }).then(player => {
        console.log(player);
      });
    },

控制台的输出是:

domng-backend | [
domng-backend |   Player {
domng-backend |     dataValues: {
domng-backend |       id: 1,
domng-backend |       name: 'Anna',
domng-backend |       nickname: '',
domng-backend |       active: true,
domng-backend |       createdAt: 2020-02-06T14:16:17.873Z,
domng-backend |       updatedAt: 2020-02-06T14:17:06.684Z,
domng-backend |       gameId: null
domng-backend |     },
domng-backend |     _previousDataValues: {
domng-backend |       id: 1,
domng-backend |       name: 'Anna',
domng-backend |       nickname: '',
domng-backend |       active: true,
domng-backend |       createdAt: 2020-02-06T14:16:17.873Z,
domng-backend |       updatedAt: 2020-02-06T14:17:06.684Z,
domng-backend |       gameId: null
domng-backend |     },
domng-backend |     _changed: {},
domng-backend |     _modelOptions: {
domng-backend |       timestamps: true,
domng-backend |       validate: {},
domng-backend |       freezeTableName: false,
domng-backend |       underscored: false,
domng-backend |       paranoid: false,
domng-backend |       rejectOnEmpty: false,
domng-backend |       whereCollection: [Object],
domng-backend |       schema: null,
domng-backend |       schemaDelimiter: '',
domng-backend |       defaultScope: {},
domng-backend |       scopes: {},
domng-backend |       indexes: [],
domng-backend |       name: [Object],
domng-backend |       omitNull: false,
domng-backend |       sequelize: [Sequelize],
domng-backend |       hooks: {}
domng-backend |     },
domng-backend |     _options: {
domng-backend |       isNewRecord: false,
domng-backend |       _schema: null,
domng-backend |       _schemaDelimiter: '',
domng-backend |       raw: true,
domng-backend |       attributes: [Array]
domng-backend |     },
domng-backend |     isNewRecord: false
domng-backend |   }
domng-backend | ]

那是为什么呢?

我还有另一个问题,reduce 函数(用于计算 sum 和 avg)不会在我的代码下方返回数据。在 sum 正常工作的情况下,返回的 Promise 将没有长度属性,因此无法计算 avg。

我开始认为我的问题是我不太理解的承诺和异步操作?

感谢您在这一点上的任何指导。

最好的问候和快乐的编码, 帕特里克

【问题讨论】:

  • 嗯,登录到控制台时看起来像这样,但在我的 GraphQL 查询中,这不是真的。架构说有一个 ID。所以我的理解是 player.id 应该是一个要检索的字段
  • @xadm 您的解决方案有效。它将返回一组活跃的玩家。这将导致模式也定义一个数组。所以这可能是一个解决方案。谢谢。因为我现在打算只处理一个游戏,这没关系,但是在前端(react.js)我必须记住我必须使用数组中的第一个结果。
  • @xadm 谢谢你的链接,你是个巫师 :thumbsup: PLUS!您还解决了我现在也可以通过这种方式解决的一般问题。如果这里有类似 reddit gold 的东西,我会把它给你。

标签: javascript node.js graphql sequelize.js


【解决方案1】:

@xadm 的评论成功了。首先,我的查询将返回一个数组,因此必须定义架构以返回一个 [Player] 数组,加上 raw: true 将省略所有我不需要的虚假内容 (https://stackoverflow.com/a/44761334/6124657)。

再次感谢。

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 2016-06-30
    • 2020-10-07
    • 1970-01-01
    • 2021-01-13
    • 2020-07-08
    • 2021-07-26
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多