Javascript 条带发票项目不总是在一张发票中一起发送

Javascript 条带发票项目不总是在一张发票中一起发送,javascript,node.js,stripe-payments,Javascript,Node.js,Stripe Payments,发送带有一个发票项目的发票效果很好,但是当我尝试发送带有多个发票项目的发票时,事情会变得有点棘手 有时会正确发送多张发票,但通常发票中缺少一个发票项,但下一张发票中包含get。或者,有时我会收到一条错误消息:错误:无需为客户开具发票,甚至还以为我刚刚运行了stripe.invoiceItems.create。还有其他人遇到过这个问题吗 要创建多个发票项目,我有如下逻辑: await req.body.items.map(item => { const unitAmount =

发送带有一个发票项目的发票效果很好,但是当我尝试发送带有多个发票项目的发票时,事情会变得有点棘手

有时会正确发送多张发票,但通常发票中缺少一个发票项,但下一张发票中包含get。或者,有时我会收到一条错误消息:
错误:无需为客户开具发票
,甚至还以为我刚刚运行了
stripe.invoiceItems.create
。还有其他人遇到过这个问题吗

要创建多个发票项目,我有如下逻辑:

  await req.body.items.map(item => {
    const unitAmount = (item.wholesale_price + (item.shipping_amount/item.quantity) + (item.s_h/item.quantity));
    stripe.invoiceItems.create({
      unit_amount: unitAmount,
      currency: 'usd',
      customer: stripe_cus_id,
      description: item.description,
      quantity: item.quantity
    }, function(err, invoiceItem) {
      if(err) {
        console.error(err);
      } else {
        console.log(`CREATED: ${item.description}`);
      }
    });
  });
然后我发送发票,如下所示:

const invoice = await stripe.invoices.create({
  customer: stripe_cus_id,
  billing: 'send_invoice',
  days_until_due: 15
});

我认为预期的行为是,发票项目被添加到客户的未来发票中,而不是当前发票

我不确定这是否是您希望的行为,但排除这种可能性,我会首先尝试检索客户即将开具的发票。我用3个发票项目(1+2+3)进行了尝试,接下来的发票中的总金额为6


我发现将
wait
Array.prototype.map
一起使用存在问题。 信中说:

问题是
await
后面的值是
Array.prototype.map
,这不是承诺。这导致
wait
过早解析

我找到了解决这个问题的办法。用
承诺包装我的地图。所有的
都解决了这个问题,就像这样:

    await Promise.all(
      req.body.items.map(item => {
        return new Promise(function( resolve, reject) {
          const unitAmount = (item.wholesale_price + (item.shipping_amount/item.quantity) + (item.s_h/item.quantity));
          stripe.invoiceItems.create({
            unit_amount: unitAmount,
            currency: 'usd',
            customer: stripe_cus_id,
            description: item.description,
            quantity: item.quantity
          }, {
            idempotency_key: uuidv4()
          }, function(err, invoiceItem) {
            if(err) {
              console.error(err);
              reject(err);
            } else {
              console.log(`CREATED: ${item.description}`);
              resolve();
            }
          });
        })
      })
    );

在尝试创建发票之前,是否确定已创建发票项?我想这是唯一的可能。如果您通过电子邮件发送到,他们的团队可以与您一起查看日志,以查看是否发生了某种时间问题。谢谢。我会发电子邮件给你。是的,我确信它是被创建的,因为我得到了一个带有invoice item对象的响应。在Stripe Dashboard的customer页面上,它还显示了待定的发票项目。有时它只是没有包含在发票中……是的,基本问题是stripe.invoiceItems.create是一个非同步调用,您的原始代码在调用invoice.create之前并没有等待它完成(即使wait使它看起来像是)。
    await Promise.all(
      req.body.items.map(item => {
        return new Promise(function( resolve, reject) {
          const unitAmount = (item.wholesale_price + (item.shipping_amount/item.quantity) + (item.s_h/item.quantity));
          stripe.invoiceItems.create({
            unit_amount: unitAmount,
            currency: 'usd',
            customer: stripe_cus_id,
            description: item.description,
            quantity: item.quantity
          }, {
            idempotency_key: uuidv4()
          }, function(err, invoiceItem) {
            if(err) {
              console.error(err);
              reject(err);
            } else {
              console.log(`CREATED: ${item.description}`);
              resolve();
            }
          });
        })
      })
    );