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) })
验证步骤
- 启动服务器,确认正常输出监听日志
- 按下
Ctrl+C,确认输出终止信号提示和服务器关闭日志 - 再次启动服务器,应不再出现
EADDRINUSE错误
内容的提问来源于stack exchange,提问作者Aaron Parisi
相关产品推荐
相关产品推荐

