【发布时间】: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