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

Express中req.body为空问题求助:多种方案尝试后仍未解决

问题根源:中间件顺序错误 + Session 中间件逻辑漏洞

我一眼就揪出了两个核心问题,这正是你拿不到req.body的关键原因:


1. 中间件顺序完全搞反了

你的自定义 Session 中间件依赖req.cookies对象,但你居然把它放在了cookieParser()之前加载!

当前错误顺序:

app.use(require('./resources/modules/session.js')); // 先加载Session中间件
// ...
app.use(cookieParser()); // 后解析Cookie

正确逻辑是先解析 Cookie,再处理 Session——因为cookieParser的作用就是把请求头里的 Cookie 字符串解析成req.cookies对象,Session 中间件必须依赖这个解析后的对象才能工作。

调整后的正确顺序:

app.use(cookieParser()); // 先解析Cookie,生成req.cookies
app.use(require('./resources/modules/session.js')); // 再基于解析后的Cookie处理Session

2. Session 中间件的逻辑漏洞会直接中断请求

你的 Session 中间件里有个致命的逻辑问题:

if (!req.cookies) next();

调用next()之后,函数并没有停止执行,后面的解构代码const { cookies: { session: sessionID } } = req;还会继续运行。而此时req.cookies是undefined,这行代码会直接抛出Cannot destructure property 'session' of undefined的错误,这个错误会中断整个请求处理流程,导致后面的body-parser中间件根本没机会处理请求体,所以req.body自然是空对象。

修复这个漏洞只需要在next()前加上return,让函数执行到这里就停止:

const enmap = require('enmap'), sessions = new enmap('sessions');
module.exports = (req, res, next) => {
  if (!req.cookies) return next(); // 加上return,终止后续代码执行
  const { cookies: { session: sessionID } } = req;
  if (sessionID) {
    const session = sessions.get(sessionID);
    req.session = session || undefined; // 简化写法,让代码更简洁
  } else {
    req.session = undefined;
  };
  next();
};

3. 额外优化:删掉多余的res.end()

你的登录路由里,res.render()已经会自动结束响应,再调用res.end()完全是画蛇添足,甚至可能导致报错:

app.post('/login', (req, res) => {
  console.log(req.body);
  res.render('login', { config, page: { name: 'Login' }, error: '' });
  // res.end(); // 删掉这行多余的代码
});

按照上面的步骤修复后,再测试表单提交或者 AJAX 请求,你应该就能正常获取到req.body里的内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:37:48