Node.js/Express接口报错req.body为undefined无法解构title属性
Express 接口req.body为undefined报错排查方案
这个报错的核心触发原因是请求到达控制器逻辑时,JSON格式的请求体还没被解析,即便你写了app.use(express.json()),90%以上的情况是以下几个配置错误导致的,按出现概率排序排查即可:
1. 中间件/路由加载顺序错误(最高发)
Express 中间件严格按照代码书写的先后顺序执行,如果你把视频路由的挂载逻辑写在了express.json()中间件注册之前,请求匹配到路由时,JSON解析逻辑根本没执行,req.body会保持默认的undefined值。
正确的Server.ts加载顺序参考:
import express from 'express'; import mongoose from 'mongoose'; import videoRoutes from './routes/Video'; const app = express(); const PORT = 3000; // 【必须先注册解析中间件,再挂载路由】 app.use(express.json()); // 跨域、日志等其他全局中间件也统一放在路由挂载前注册 // 路由挂载必须放在所有解析类中间件的后面 app.use('/api/videos', videoRoutes); // 数据库连接、服务启动逻辑放后面即可 mongoose.connect('你的MongoDB连接地址') .then(() => console.log('数据库连接成功')) .catch(err => console.error('数据库连接失败', err)); app.listen(PORT, () => { console.log(`服务已启动,端口:${PORT}`); });
2. Thunder Client请求配置错误
express.json()只会解析请求头Content-Type为application/json的请求体,请求端配置错误也会导致解析失败,逐项检查:
- 打开请求编辑页的
Headers标签,确认存在Content-Type: application/json配置,不存在就手动添加 - 打开
Body标签,选中JSON格式选项,不要选form-data、x-www-form-urlencoded、text等其他格式 - 提交的视频数据要写为标准JSON格式,参考样例:
{ "title": "面试项目测试视频", "description": "面向登录用户展示的测试视频内容", "videoUrl": "https://res.example.com/demo.mp4", "coverUrl": "https://res.example.com/cover.jpg" }
3. 其他冲突配置排查
- 如果你额外安装了
body-parser包并注册了其他解析规则,会和Express内置的JSON解析冲突,Express 4.16.0及以上版本完全内置了JSON解析能力,不需要额外引入body-parser相关依赖,把多余的解析中间件删掉即可 - 不要在单个POST路由上单独注册
express.raw()、express.text()等其他解析中间件,会覆盖全局的JSON解析规则
快速验证方法
在视频控制器的最开头加一行调试代码:
const createVideo = async (req: Request, res: Response) => { // 加这行调试 console.log('请求Content-Type:', req.headers['content-type'], '解析到的body:', req.body); const { title } = req.body; // 剩下的业务逻辑 }
发请求后看终端打印结果:如果打印的Content-Type不是application/json,就是Thunder Client配置错了;如果Content-Type正确但body还是undefined,回去检查中间件和路由的加载顺序。
内容的提问来源于stack exchange,提问作者Géhème
相关产品推荐
相关产品推荐

