我有一个简单的服务器运行在node.js使用连接:

var server = require('connect').createServer();
//actions...
server.listen(3000);

在我的代码中,我有实际的处理程序,但这是基本的思想。我一直遇到的问题是

EADDRINUSE, Address already in use

我收到这个错误时再次运行我的应用程序后,它以前崩溃或错误。因为我没有打开一个新的终端实例,所以我用ctr + z关闭了这个进程。

我非常确定我所要做的就是关闭服务器或连接。我尝试在进程中调用server.close()。(“退出”,…);运气不好。


当前回答

的过程。On ('exit', ..)在进程崩溃或被杀死时不会被调用。它只在事件循环结束时被调用,由于server.close()在某种程度上结束了事件循环(它仍然需要等待当前正在运行的堆栈),因此将它放在退出事件中没有意义…

在崩溃时,执行进程。on('uncaughtException', ..)和on kill do进程。(SIGTERM, . .)

也就是说,SIGTERM(默认终止信号)让应用程序清理,而SIGKILL(立即终止)不会让应用程序做任何事情。

其他回答

我也面临着同样的问题。我刚刚把我的端口号从8000改成了6000。 当你有3000的时候,你可以尝试5000、4000、7000、8000等等。

这意味着你有两个节点服务器运行在同一个端口上,如果一个运行在端口上,比如3000,将另一个端口更改为另一个端口,比如3001,一切都将正常工作

你也可以通过命令行方式:

ps aux | grep node

来获取进程id。

然后:

kill -9 PID

在kill时执行-9会发送SIGKILL(而不是SIGTERM)。 SIGTERM有时会被节点忽略。

只杀死使用给定PORT的节点进程。正如其他人提到的,在bash中可以使用kill $(lsof -t -i:PORT)

这里有一个Windows解决方案(有一个方法!): Netstat -bona | findstr "。0:PORT +0.0.0.0:0 +LISTENING" | for /f "令牌=5" %t in ('more') do taskkill /PID:%t /f。你需要一个提升终端(在VSCode中,你需要通过提升来打开自己,因为集成终端不能被提升)。

PS:如果findstr不可用,您可以简单地使用查找和替换空格“+”(非正则模式)

你可能会遇到这样的情况,即使杀死线程或进程也不会真正终止应用程序(我在Linux和Windows上每隔一段时间就会遇到这种情况)。有时,您可能已经有一个正在运行的实例,但没有关闭。

由于这些情况,我更喜欢在package.json中添加:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

然后我可以调用它们使用:

npm run stop-win
npm run stop-Linux

如果您愿意,还可以让这些BIN命令带有参数标志。您还可以将它们添加为在try-catch子句中执行的命令。