Mongoose连接MongoDB后req.body为空 报EADDRINUSE端口占用错误
Express + Mongoose 开发常见两类异常解决方案
问题1:MongoDB连接成功,但接口读取req.body返回空对象
这个问题和数据库连接无关,是请求体解析环节配置错误导致,按以下顺序排查:
- 确认Express内置请求体解析中间件注册在所有路由定义之前,顺序错误会导致请求进入路由逻辑时还未完成解析,req.body默认为空对象。
正确配置代码:
错误写法参考(顺序颠倒会直接导致解析失效):// 必须写在所有app.use(路由) 之前 app.use(express.json()) // 解析JSON格式请求体 app.use(express.urlencoded({ extended: true })) // 解析表单格式请求体// 错误示例 app.use('/api/user', userRouter) app.use(express.json()) - 检查发请求时的请求头配置,必须携带
Content-Type: application/json,未携带该请求头时,Express不会将传入参数按JSON格式解析,req.body会为空。 - 排查是否存在重复的请求体解析中间件冲突,比如额外引入旧版
body-parser包且注册顺序混乱,也会覆盖解析结果导致取值失败。
问题2:启动服务报错 Error: listen EADDRINUSE: address already in use :::3000
该错误代表3000端口已经被其他运行中的进程占用,按以下步骤解决:
- 查询占用3000端口的进程ID(PID),根据自己的操作系统执行对应命令:
- Windows系统执行:
netstat -ano | findstr :3000,返回结果最后一列的数字即为PID - Mac/Linux系统执行:
lsof -i :3000,返回结果中PID列的数字即为进程号
- Windows系统执行:
- 强制杀掉占用端口的进程:
- Windows系统执行:
taskkill /f /pid 替换为你查到的PID - Mac/Linux系统执行:
kill -9 替换为你查到的PID
- Windows系统执行:
- 如果不想终止占用3000端口的其他进程,直接修改当前服务的监听端口即可,比如将端口改为3001:
const PORT = 3001 app.listen(PORT, () => { console.log(`服务已启动,运行端口:${PORT}`) }) - 注:nodemon异常崩溃时偶尔会出现端口未正常释放的情况,杀掉残留进程后重启nodemon即可恢复。
内容的提问来源于stack exchange,提问作者FAIZ ALAM
相关产品推荐
相关产品推荐

