我在我的GraphQL
和Sequelize
后端遇到错误,由于某种原因,我的变异不会返回数据,即使我保证我的解析器内部会返回数据。我觉得这可能是我想念的小事,但我已经被困了一段时间。
Sequelize
部分有效,对象确实已插入,但返回始终为空对象。
这是我的突变:
mutation {
createUserVoucher(pinId: 1, voucherId: 1) {
id
}
}
这是回报:
{
"data": {
"createUserVoucher": {
"id": null
}
}
}
这是我的解析器:
createUserVoucher: (parent, args, { user, models }) => {
args['userId'] = user.id;
models.UserVoucher.count({
where: {utilized: true, pinId: args.pinId, userId: args.userId}
}).then( c => {
if (c > 0) {
return []
} else {
models.Voucher.findOne({
where: {
id: args.voucherId
}
}).then( voucher => {
models.UserVoucher.count({
where: { voucherId: args.voucherId }
}).then( c => {
return models.UserVoucher.create(args)
})
})
}
});
return []
}
UserVoucher定义:
type UserVoucher {
id: Int
nodeId: Int!
userId: ID!
voucherId: ID!
voucher: Voucher
pinId: ID!
capturedAt: DateTime
utilized: Boolean
}
`;
突变定义:
createUserVoucher(
pinId: Int!,
voucherId: Int!
): UserVoucher
关于我缺少的任何想法?非常感谢,非常感谢! 如果需要更多信息,请告诉我们!
答案 0 :(得分:1)
你错过了三次回报:
createUserVoucher: (parent, args, { user, models }) => {
args['userId'] = user.id;
return models.UserVoucher.count({ <----- HERE
where: {utilized: true, pinId: args.pinId, userId: args.userId}
}).then( c => {
if (c > 0) {
return []
} else {
return models.Voucher.findOne({ // <----- HERE
where: {
id: args.voucherId
}
}).then( voucher => {
return models.UserVoucher.count({ // <----- AND HERE
where: { voucherId: args.voucherId }
}).then( c => {
return models.UserVoucher.create(args)
})
})
}
});
return []
}
当链接承诺时,重要的是要记住在每个then
调用中总是返回任何额外的承诺 - 否则承诺会被触发但不等待它。
其他一些注意事项:
虽然严格不会伤害任何东西,但您应该在解析器中返回null
而不是空数组。根据您的架构,您的突变会返回一个可以为空的UserVoucher对象。返回一个空数组会误导任何读取代码的人,因为它意味着这个解析器应该返回一个数组。
第二次UserVoucher.count
来电和Voucher.findOne
来电的结果未被使用,这意味着他们可能没有必要?
最后,您还可以使用async / await:
来显着清理代码createUserVoucher: async (parent, args, { user, models }) => {
args['userId'] = user.id;
const c = await models.UserVoucher.count({
where: {utilized: true, pinId: args.pinId, userId: args.userId}
})
if (c > 0) return null
const voucher = await models.Voucher.findOne({
where: { id: args.voucherId }
})
const c2 = await models.UserVoucher.count({
where: { voucherId: args.voucherId }
})
return models.UserVoucher.create(args) // still need a return here
}