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

Node.js提示端口被占用却检测不到对应进程的排查求助

解决方案

1. 修复信号监听的拼写错误

你的代码中把Ctrl+C触发的终止信号SIGINT误写为SIGING,这直接导致按下Ctrl+C时,服务器的清理函数exit没有被调用,进程无法正常释放端口。

修改这一行:

process.on('SIGING', exit)

为:

process.on('SIGINT', exit)

2. 优化服务器关闭逻辑

当前exit函数的日志输出位置错误,且未处理关闭失败的情况,调整后确保服务器真正关闭后再退出进程:

const exit = signal => {
  log(`Received ${signal}, shutting down server...`)
  server.close(err => {
    if (err) {
      log(`Server close error: ${err}`, 'ERROR')
      process.exit(1)
    }
    log('Server is closed.')
    process.exit(0)
  })
}

3. 启用端口复用

TCP端口在进程退出后可能会进入TIME_WAIT状态(默认持续数分钟),导致暂时无法复用。可以在启动服务器时启用端口复用选项:

const server = http.createServer(handleRequest)
server.listen({
  host: process.env.HOST,
  port: process.env.PORT,
  reuseAddr: true
}, () => log(`Server is listening on ${process.env.HOST}:${process.env.PORT}`))

4. 完善未捕获异常处理

当前的uncaughtException处理未主动退出进程,可能导致进程僵死,建议记录错误后立即退出:

process.on('uncaughtException', (err, origin) => {
  log(`Process caught unhandled exception: ${err} ${origin}`, 'ERROR')
  process.exit(1)
})

验证步骤

  1. 启动服务器,确认正常输出监听日志
  2. 按下Ctrl+C,确认输出终止信号提示和服务器关闭日志
  3. 再次启动服务器,应不再出现EADDRINUSE错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:37:17