如何将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存储实现跨请求的数据共享:
- 首先安装并配置
express-session中间件:
const session = require('express-session'); // 放在所有路由定义之前 app.use(session({ secret: '自定义安全秘钥字符串', resave: false, saveUninitialized: false, cookie: { secure: false } // 生产环境开启HTTPS后改为true }))
- 修改
/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); });
- 修改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
相关产品推荐
相关产品推荐

