向Stripe Checkout传递MongoDB购物车动态值出错求助
MongoDB购物车数据转Stripe Checkout格式报错排查
将MongoDB数据库中的购物车对象传递给Stripe Checkout时遇到问题。提取cart.products数组并转换为Stripe要求的结构时,出现「无效字符串」「无法读取undefined的map」等错误。手动传入固定数组可成功,但动态生成的数组插入失败。以下是相关代码、控制台及终端输出:
相关代码(app.js)
依赖引入
const express = require('express'); const app = express(); const stripe = require('stripe')(stripeSecretKey); const User = require('./models/users'); var Cart = require('./models/cart');
接口逻辑
app.post('/create-checkout-session', async (req, res) => { const owner = req.user.id; const user = await User.findById(owner); const cart = await Cart.findOne({user: user}); console.log(cart.products); // console.log(req.session.cart);//undefined console.log(req.session); const productsList = []; for (let i = 0; i < cart.products.length; i++) { const productName = cart.products[i].name; console.log(productName); const image_url = cart.products[i].image; const price = cart.products[i].price; console.log(price); const id = cart.products[i].id; console.log(id); const quantity = cart.products[i].quantity; productsList.push({productName, price, id, quantity}) console.log(productsList) } const items = productsList.map((product) => { return { price_data: { currency: 'usd', product_data: { name: product.productName, }, unit_amount: Number(product.price), }, quantity: Number(product.quantity), } }); console.log(items) try { const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], mode: 'payment', line_items: items, success_url: `${process.env.SERVER_URL}/success.html`, cancel_url: `${process.env.SERVER_URL}/cancel.html` }) res.json({url: session.url}) } catch(e) { res.status(500).json({error: e.message}) } });
控制台输出
Invalid string: {:quantity=>"1", :id=>"65b80e868dc64e9eee697279", :productName=>"Black Mug", :price=>"2999"}
终端输出
[ { price_data: { currency: 'usd', product_data: [Object], unit_amount: 2999 }, quantity: 1 }, { price_data: { currency: 'usd', product_data: [Object], unit_amount: 2999 }, quantity: 2 }, { price_data: { currency: 'usd', product_data: [Object], unit_amount: 3999 }, quantity: 4 }, { price_data: { currency: 'usd', product_data: [Object], unit_amount: 3499 }, quantity: 2 }, { price_data: { currency: 'usd', product_data: [Object], unit_amount: 4999 }, quantity: 2 }, { price_data: { currency: 'usd', product_data: [Object], unit_amount: 4999 }, quantity: 1 } ]
问题排查与修正要点
- 变量作用域问题:原代码中
productName等变量未用const/let声明,导致全局污染,在map函数中错误引用了最后一次循环的productName值,而非当前遍历的产品名称。需给循环内的变量添加const声明,并在map中使用product.productName获取当前产品名称。 - 数据类型不匹配:Stripe要求
unit_amount为数字类型、quantity为整数类型,而数据库中取出的price和quantity可能是字符串,需通过Number()转换为数字。 - 语法错误:原代码中
success_url和cancel_url的模板字符串缺失外层反引号,导致语法错误,需补充完整。
内容的提问来源于stack exchange,提问作者EgyptianG
相关产品推荐
相关产品推荐

