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

如何将Express中req.body的价格数据传入Stripe支付路由解决读取报错

错误本质

你遇到的报错核心原因是调用/create-checkout-session路由时,请求的req.body中不存在你预期的数组结构,导致req.body[0]为undefined,读取其price属性时触发报错。

常见原因与对应解决方法

场景1:客户端直接调用/create-checkout-session路由

  • 首先确认Express全局已配置JSON请求解析中间件,确保可以解析POST请求的JSON格式请求体:
// 放在所有路由定义之前
app.use(express.json())
  • 确认客户端发起请求时,请求头Content-Type设置为application/json,且请求体结构和你传给/data路由的结构完全一致,示例请求体格式如下:
[{"price": 2000}]
  • 可在Stripe路由开头添加打印日志,确认实际拿到的请求体结构,方便排查:
app.post("/create-checkout-session", async (req, res) => {
  console.log('当前请求body:', req.body)
  // 后续逻辑
})
  • 注意Stripe的unit_amount参数要求为货币最小单位,英镑对应的最小单位是便士,1英镑=100便士,不要使用你之前代码里的*1000逻辑,否则会多收10倍费用。

场景2:你想在服务端把/data路由拿到的价格共享给Stripe路由

不同请求的req对象是完全独立的,/data路由拿到的req.body不会自动共享给其他路由,你可以通过session存储实现跨请求的数据共享:

  1. 首先安装并配置express-session中间件:
const session = require('express-session');
// 放在所有路由定义之前
app.use(session({
  secret: '自定义安全秘钥字符串',
  resave: false,
  saveUninitialized: false,
  cookie: { secure: false } // 生产环境开启HTTPS后改为true
}))
  1. 修改/data路由,把价格存入session:
app.post("/data", (req, res) => {
  // 英镑转便士,乘100
  let price = req.body[0].price * 100;
  req.session.cakePrice = price;
  console.log(`Cake price is: £${price/100}`);
  res.sendStatus(200);
});
  1. 修改Stripe路由,从session中读取价格:
app.post("/create-checkout-session", async (req, res) => {
  // 价格不存在时提前返回报错,避免后续逻辑异常
  if(!req.session.cakePrice) {
    return res.status(400).send("未获取到蛋糕价格,请先提交价格信息");
  }
  const session = await stripe.checkout.sessions.create({
    payment_method_types: ["card"],
    line_items: [
      {
        price_data: {
          currency: "gbp",
          unit_amount: req.session.cakePrice,
          product_data: {
            name: "CakeItOrLeaveIt",
          },
        },
        quantity: 1,
      },
    ],
    mode: "payment",
    success_url: `http://localhost:4242/success.html`,
    cancel_url: `http://localhost:4242/cancel.html`,
  });
  res.redirect(303, session.url);
});

临时兜底方案

你可以用可选链运算符加默认值避免直接报错,示例如下:

unit_amount: req.body?.[0]?.price || 2000 // 未获取到价格时默认收20英镑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:15:03