You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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   } ] 

问题排查与修正要点

  1. 变量作用域问题:原代码中productName等变量未用const/let声明,导致全局污染,在map函数中错误引用了最后一次循环的productName值,而非当前遍历的产品名称。需给循环内的变量添加const声明,并在map中使用product.productName获取当前产品名称。
  2. 数据类型不匹配:Stripe要求unit_amount为数字类型、quantity为整数类型,而数据库中取出的price和quantity可能是字符串,需通过Number()转换为数字。
  3. 语法错误:原代码中success_url和cancel_url的模板字符串缺失外层反引号,导致语法错误,需补充完整。

内容的提问来源于stack exchange,提问作者EgyptianG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:52:18