客户端JS发POST请求时Node.js后端req.body为空的问题求助
问题描述
我需要通过客户端JavaScript向Node.js后端发送POST请求完成OTP验证,之前查找同类问题未解决,故发起问询。
当前问题:
- 前端
otp.value存在有效值,但后端打印req.body为空对象 - 客户端收到返回结果
{isVerified:false}
客户端JS代码
const verifyOtp = async (otp) => { const res = await fetch("http://127.0.0.1:3000/api/otpVerify", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ otp: otp.value }), }); const data = await res.json(); console.log(data); }
后端Node.js路由代码
const verifyOtp = router.post("/api/otpVerify", (req, res, next) => { const otp = req.body; console.log("Otp recieved: ", otp); console.log("Actual Otp: ", req.session.otp); if (otp == req.session.otp) { return res.json({ isVerified: true }); } return res.json({ isVerified: false }); });
App.js配置代码
const express = require("express"); const bodyParser = require("body-parser"); const path = require("path"); const session = require("express-session"); const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use( session({ secret: "cezisbest", resave: false, saveUninitialized: false }) ); app.use(express.static(path.join(__dirname + "public"))); app.set("view engine", "ejs"); app.set("views", "views"); app.use((req, res, next) => { res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "GET, POST"); res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); res.setHeader( "Access-Control-Allow-Headers", "Content-Type, application/json" ); next(); }); app.use("/api", userRoutes); app.listen(process.env.PORT);
问题排查与解决
1. 修正路由路径重复问题
后端路由定义了/api/otpVerify,但App.js中已经通过app.use("/api", userRoutes)给所有路由添加了/api前缀,导致实际接口路径变成/api/api/otpVerify,和前端请求的/api/otpVerify不匹配,这是req.body为空的核心原因之一。
修复方案:将后端路由路径改为/otpVerify,结合前缀后实际路径与前端请求一致:
const verifyOtp = router.post("/otpVerify", (req, res, next) => { // 原有逻辑保留 });
2. 修正req.body取值方式
前端发送的是{ otp: 具体值 }格式的JSON,后端直接取req.body拿到的是整个对象,和req.session.otp中的字符串/数字比较必然不相等。需要改为取req.body.otp字段:
const otp = req.body.otp; // 提取otp字段值 console.log("Otp recieved: ", otp); if (otp == req.session.otp) { return res.json({ isVerified: true }); } return res.json({ isVerified: false });
3. 合并重复的CORS头设置
App.js中两次设置Access-Control-Allow-Headers,第二次会覆盖第一次,导致Authorization头被移除,建议合并为一行:
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, application/json");
4. 确认session有效性
如果上述修复后仍有问题,检查req.session.otp是否已被正确初始化,可以在路由中打印req.session确认session是否正常工作。
内容的提问来源于stack exchange,提问作者random1234
相关产品推荐
相关产品推荐

