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

MERN项目连接MongoDB后遇EADDRINUSE端口占用错误求助

问题排查:EADDRINUSE 端口占用错误

问题描述

我是MERN和React新手,之前服务器端口运行正常,连接MongoDB后出现端口占用错误。已尝试更换端口、关闭任务管理器中的Node进程,但问题仍未解决,请求协助排查。

我的代码

require('dotenv').config()

const express = require("express")
const mongoose = require('mongoose')
const workoutRoutes = require('./routes/workouts')

const app = express()

//middleware
app.use(express.json())

app.use((req, res, next) => {
    console.log(req.path, req.method)
    next()
})

//routes
app.use('/api/workouts', workoutRoutes)

//connect to db
mongoose.connect(process.env.MONGO_URI)
  .then(() => {
    // listen to port
    app.listen(process.env.PORT, () => {
      console.log('listening for requests on port', process.env.PORT)
    })
  })
  .catch((err) => {
    console.log(err)
  }) 

//listening for requests
app.listen(process.env.PORT, () => {
    console.log("listening on port", process.env.PORT)
})

错误信息

Error: listen EADDRINUSE: address already in use :::4000
    at Server.setupListenHandle [as _listen2] (node:net:1733:16)
    at listenInCluster (node:net:1781:12)
    at Server.listen (node:net:1869:7)
    at Function.listen (C:\Users\urbai\OneDrive\Desktop\MERN STACK\backend\node_modules\express\lib\application.js:635:24)
    at C:\Users\urbai\OneDrive\Desktop\MERN STACK\backend\server.js:25:9
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Emitted 'error' event on Server instance at:
    at emitErrorNT (node:net:1760:8)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  code: 'EADDRINUSE',
  errno: -4091,
  syscall: 'listen',
  address: '::',
  port: 4000
}

Node.js v18.13.0
[nodemon] app crashed - waiting for file changes before starting...

问题根源

代码中重复调用了两次app.listen():

  1. 第一次在MongoDB连接成功的.then()回调内
  2. 第二次在代码末尾的全局作用域

程序启动时,全局的app.listen()先执行并占用端口;随后MongoDB连接成功后,再次执行app.listen()尝试监听同一端口,导致端口被自身进程占用,抛出EADDRINUSE错误。

解决方案

删除代码末尾的全局app.listen()代码块,只保留MongoDB连接成功后的监听逻辑,确保服务器仅在数据库连接就绪后启动:

修改后的代码:

require('dotenv').config()

const express = require("express")
const mongoose = require('mongoose')
const workoutRoutes = require('./routes/workouts')

const app = express()

//middleware
app.use(express.json())

app.use((req, res, next) => {
    console.log(req.path, req.method)
    next()
})

//routes
app.use('/api/workouts', workoutRoutes)

//connect to db
mongoose.connect(process.env.MONGO_URI)
  .then(() => {
    // listen to port
    app.listen(process.env.PORT, () => {
      console.log('listening for requests on port', process.env.PORT)
    })
  })
  .catch((err) => {
    console.log(err)
  }) 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:42