0

嗨 stackoverflow 社区,

我正在尝试使用 for 循环从条带 API 中为userItems数组中的每个项目检索价格 ID

[
    {
      quantity: '1',
      stripe_id: 'prod_IlBmZ4z2QNWeDb',
      stripe_price_id: 'price_1I9fOWLY0lC869vlVNfnYqT3',
      printful_id: '211335091',
      external_id: '6000dcdfa3b443'
    }
  ]

但是我被困在时间死区,导致我检索到“ReferenceError:在初始化之前无法访问'price'”错误

我相信它是因为在条带 API 返回对象item之前声明了它price

item在分配price.unit_amount给对象变量并将其推送到数组之前,如何等到条带返回lineItems

我一直在摆弄 promise 语法试图解决这个问题,但我在掌握 promises/async/await 时遇到了麻烦(尤其是在 stripe API 的上下文中,文档并没有真正触及这种细微差别)所以我很困惑

这是我当前的代码

router.post('/create-session', async (req, res) => {
    if (Array.isArray(req.body) == false) {
        var userItems = [req.body];
    } else {
        var userItems = req.body;
    }
    console.log(userItems)
    const lineItems = [];
    const metaData = []
    var i;
    try {
        for (i = 0; i < userItems.length; i++) {
            const price = await stripe.prices.retrieve(
                userItems[i].stripe - price - id
            );
            var item = {
                quantity: userItems[i].quantity,
                price_data: {
                    currency: 'usd',
                    product: userItems[i].stripe_id,
                    unit_amount: price.unit_amount
                }
            }

            //   var itemMetaData = {
            //       variant_id: userItems[i].printful-id,
            //      external_id: userItems[i].external-id
            //  } */
            //lineItems.push(item)
            // metaData.push(itemMetaData)

        }
        //create checkout session
        const session = await stripe.checkout.sessions.create({
            billing_address_collection: 'auto',
            shipping_address_collection: {
                allowed_countries: ['US'],
            },
            payment_method_types: ['card'],
            line_items: lineItems,
            //   metadata: metaData,
            mode: 'payment',
            success_url: `http://localhost:5000/success.html`,
            cancel_url: `http://localhost:5000/cancel.html`,
        });
        res.json({
            //return session ID
            id: session.id
        });
    } catch (err) {
        console.log(err)
    }
});

谢谢!

4

2 回答 2

0

在变量初始化之前,您似乎在表达式中使用了价格变量。你的意思是使用userItems[i].price

try {
    var i;
    for (i = 0; i < userItems.length; i++) {
        const price = await stripe.prices.retrieve(
            userItems[i].stripe - userItems[i].price - userItems[i].id
        );
        var item = {
            quantity: userItems[i].quantity,
            price_data: {
                currency: 'usd',
                product: userItems[i].stripe_id,
                unit_amount: price.unit_amount
            }
        }
        lineItems.push(item)
    }
    //create checkout session
    const session = await stripe.checkout.sessions.create({
        billing_address_collection: 'auto',
        shipping_address_collection: {
            allowed_countries: ['US'],
        },
        payment_method_types: ['card'],
        line_items: lineItems,
        mode: 'payment',
        success_url: `http://localhost:5000/success.html`,
        cancel_url: `http://localhost:5000/cancel.html`,
    });
    res.json({
        //return session ID
        id: session.id
    });
} catch (err) {
    console.log(err)
}
于 2021-01-19T20:01:08.260 回答
0

我想到了。我有

   const price = await stripe.prices.retrieve(
                userItems[i].stripe-price-id
             ); 

代替

   const price = await stripe.prices.retrieve(
                userItems[i].stripe_price_id
             ); 

谢谢大家,我会匆匆离开,这样我就可以带着我庞大而庞大的大脑,继续享受我的高智商

于 2021-01-19T21:07:25.383 回答