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

客户端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:15:28