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

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系统执行:taskkill /f /pid 替换为你查到的PID
    • Mac/Linux系统执行:kill -9 替换为你查到的PID
  • 如果不想终止占用3000端口的其他进程,直接修改当前服务的监听端口即可,比如将端口改为3001:
    const PORT = 3001
    app.listen(PORT, () => {
      console.log(`服务已启动,运行端口:${PORT}`)
    })
    
  • 注:nodemon异常崩溃时偶尔会出现端口未正常释放的情况,杀掉残留进程后重启nodemon即可恢复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:42:45