我正在尝试在GraphQl中创建一个突变,该突变为用户充电带有条纹,但我无法使用户返回客户端。一切都在我的数据库中运行良好,付款完成了,但是在我的客户端,.when()的触发时间过早,而Null的结果应该返回我的编辑用户。它实际上是在Stripe之前发射。
服务器端:
chargeUser(args) {
const { userId, membershipId, stripeToken } = args;
return User.findById(userId)
.then((user) => {
return Membership.findById(membershipId)
.then((membership) => {
return stripe.charges.create({
amount: membership.price * 100,
currency: 'chf',
source: stripeToken,
description: `${user.firstname} ${user.lastname}`
}, function(err) {
if (!err) {
user.membership = membershipId;
return user.save();
} else {
console.log(err)
}
});
})
});
}
客户端:
this.props.mutate({
variables: {
membershipId: this.props.membershipId,
userId: global.userId,
stripeToken: token.tokenId
}
})
.then((res) => {
// Returning null before the stripe.charges has finished
console.log(res)
})
这里的问题是stripe.charges.create()
使用了回调。它没有回报承诺。与承诺不同,回电内的用户无能为力 - 您的承诺链以 stripe.charges.create()
的返回值终止,即null。
为了使您的解析器等待回调,您必须将其包裹在承诺中,例如:
return User.findById(userId)
.then((user) => {
return Membership.findById(membershipId)
.then((membership) => {
return new Promise((resolve, reject) => {
stripe.charges.create({
amount: membership.price * 100,
currency: 'chf',
source: stripeToken,
description: `${user.firstname} ${user.lastname}`
}, (err) => {
err ? reject(err) : resolve()
})
})
})
.then(() => user.save())
})
或用异步/等待的稍微清理一点:
const chargeUser = async (args) => {
const { userId, membershipId, stripeToken } = args;
const user = await User.findById(userId)
const membership = await Membership.findById(membershipId)
await new Promise((resolve, reject) => {
stripe.charges.create({
amount: membership.price * 100,
currency: 'chf',
source: stripeToken,
description: `${user.firstname} ${user.lastname}`
}, (err) => {
err ? reject(err) : resolve()
})
})
return user.save()
}