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
相关产品推荐
相关产品推荐

