Javascript Sequelize和GraphQL解析器不可为空的字段

Javascript Sequelize和GraphQL解析器不可为空的字段,javascript,node.js,graphql,sequelize.js,Javascript,Node.js,Graphql,Sequelize.js,我遇到了这个问题,我的解析器将返回一个错误,告诉我一个不可为null的字段有null,尽管我的数据库中显然有数据(因为我正在使用sqlite浏览器查看它)。这是因为它将为player.id(或player对象)返回null 因此,我正在使用graphql的模型和模式,并希望返回一个特定的播放器,它有一个标志(active=true)。我可以很好地返回所有球员,并将得到所有球员。但在我的解析器中进行过滤时: async-activePlayer(root、args、{models}){ 返回mod

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

因此,我正在使用graphql的模型和模式,并希望返回一个特定的播放器,它有一个标志(active=true)。我可以很好地返回所有球员,并将得到所有球员。但在我的解析器中进行过滤时:

async-activePlayer(root、args、{models}){
返回models.Player.findAll({where:{active:true}});
}
我将收到空数据->因此在查询时发送错误:

{
“错误”:[
{
“消息”:“不能为不可为空的field Player.id.返回空值”,
“地点”:[
{
"行":3,,
“栏”:5
}
],
“路径”:[
“动态玩家”,
“id”
],
“扩展”:{
“代码”:“内部服务器错误”,
“例外情况”:{
“stacktrace”:[
“错误:无法为不可为null的field Player.id返回null。”,
“在completeValue(/usr/src/app/node_modules/graphql/execution/execute.js:560:13)”中,
“在完成时,ValueCatchingError(/usr/src/app/node_modules/graphql/execution/execute.js:495:19)”,
“在resolveField(/usr/src/app/node_modules/graphql/execution/execute.js:435:10)”中,
“在executeFields(/usr/src/app/node_modules/graphql/execution/execute.js:275:18)”中,
“在collectAndExecuteSubfields(/usr/src/app/node_modules/graphql/execution/execute.js:713:10)”中,
“在completeObjectValue(/usr/src/app/node_modules/graphql/execution/execute.js:703:10)中,”,
“在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(索引0)”
]
}
}
}
],
“数据”:{
“activePlayer”:空
}
}
然而,当通过返回的承诺进行映射并将其记录到控制台时,我会将所需的对象写入控制台:

async-activePlayer(root、args、{models}){
models.Player.findAll({where:{active:true}}})。然后(Player=>{
控制台日志(播放器);
});
},
控制台中的输出为:

domng后端|[
domng后端|播放器{
domng后端|数据值:{
domng后端| id:1,
domng后端|名称:“安娜”,
domng后端|昵称:“”,
domng后端|活动:真,
domng后端|创建日期:2020-02-06T14:16:17.873Z,
domng后端|更新日期:2020-02-06T14:17:06.684Z,
domng后端|游戏ID:空
domng后端|},
domng后端|_以前的数据值:{
domng后端| id:1,
domng后端|名称:“安娜”,
domng后端|昵称:“”,
domng后端|活动:真,
domng后端|创建日期:2020-02-06T14:16:17.873Z,
domng后端|更新日期:2020-02-06T14:17:06.684Z,
domng后端|游戏ID:空
domng后端|},
domng后端|_已更改:{},
domng后端| |模型选项:{
domng后端|时间戳:真,
domng后端|验证:{},
domng后端|冻结表名称:false,
domng后端|下划线:false,
domng后端|偏执狂:错误,
domng后端|拒绝空:false,
domng后端| whereCollection:[对象],
domng后端|架构:null,
domng后端| schemaDelimiter:“”,
domng后端| defaultScope:{},
domng后端|作用域:{},
domng后端|索引:[],
domng后端|名称:[对象],
domng后端|省略NULL:false,
domng后端| sequelize:[sequelize],
domng后端|挂钩:{}
domng后端|},
domng后端|_选项:{
domng backend | isNewRecord:false,
domng后端|_架构:null,
domng后端| |方案限制器:“”,
domng backend | raw:true,
domng后端|属性:[数组]
domng后端|},
domng backend | isNewRecord:false
domng后端|}
domng后端|]
那为什么呢

另外,我还有一个问题,reduce函数(用于计算sum和avg)不会返回代码下面的数据。当sum正常工作时,返回的承诺将没有长度属性,因此无法计算平均值

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

感谢您在这一点上对任何方向的指导

致以最良好的祝愿,祝您幸福,
帕特里克的评论起了作用。首先,我的查询将返回一个数组,因此必须定义schema以返回[Player]的数组,加上raw:true将省略我不需要的所有伪值()


再次感谢。

当登录到控制台时,看起来是这样的,但在我的GraphQL查询中,这不是真的。模式表示存在一个ID。因此我的理解是player.ID应该是retrieve@xadm你的解决方案有效。它将返回一组活跃的玩家。这将导致模式也定义一个数组。所以这可能是一个解决方案。谢谢由于我计划现在只处理一个游戏,这是可以的,但在前端(react.js),我必须记住我必须使用数组中的第一个结果。@xadm感谢链接,您是一个向导:thumbsup:PLUS!你也解决了我的一般问题,我现在也能用这种方法解决。如果这里有像reddit gold这样的东西,我会给你的。