带有条纹和MogoDB积分的GraphQL突变返回NULL的时间太早



我正在尝试在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()
}

最新更新