为何POST请求中无法获取req.body?Passport.js登录场景排查
Passport.js登录时req.body为空的问题排查与解决
问题描述
尝试通过Passport.js实现登录功能,React客户端传递用户名和密码到Express服务端,但服务端控制台打印的req.body为空对象,导致passport-local无法读取认证参数。
核心原因与解决方案
1. 客户端缺少请求头配置
React的fetch请求中,使用JSON.stringify()序列化请求体时,必须显式设置Content-Type: application/json请求头,否则服务端的body-parser.json()中间件无法识别请求体格式,无法解析出req.body数据。
修改后的客户端postLogin函数:
const postLogin = async (username, password) => { await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' // 新增请求头 }, body: JSON.stringify({ username: username, password: password }) }) .then(data => console.log(data)) }
2. 服务端中间件验证
你的服务端代码已经正确挂载了body-parser.json()和body-parser.urlencoded()中间件,且顺序在路由处理之前,这部分配置没问题。如果后续仍有问题,可以检查:
- 确认路由挂载到Express主应用时的路径是否正确(比如主应用是否用
app.use('/auth', router)挂载了该路由) - 检查是否有其他中间件拦截了请求体数据
测试验证
修改客户端代码后,可通过浏览器开发者工具的Network面板查看POST请求的Headers,确认Content-Type已设置为application/json,此时服务端控制台打印的req.body应该能正确显示传入的用户名和密码。
内容的提问来源于stack exchange,提问作者Joshua Cushing
相关产品推荐
相关产品推荐

