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():
- 第一次在MongoDB连接成功的
.then()回调内 - 第二次在代码末尾的全局作用域
程序启动时,全局的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
相关产品推荐
相关产品推荐

