EADDRINUSE error: How do you run nodemon with express so it does not listen to a port that is already in use?

EADDRINUSE error: How do you run nodemon with express so it does not listen to a port that is already in use?

我正在编写一个运行 express server 并同时运行 nodemon 和 ngrok 的 slack bot 教程。

我 运行 遇到的问题是:

Error: listen EADDRINUSE: address already in use :::5000

我认为发生错误是因为 nodemon re-runs 表示更新发生的时间。 index.js:

const server = app.listen(process.env.PORT || 5000, () => {
  console.log('Express server listening on port %d in %s mode', server.address().port, app.settings.env);
});

我去过几个兔子洞,包括 parent 和 child 'processes' (https://dev.to/kyrelldixon/how-to-setup-an-express-js-server-in-node-js-56hp)

和/或看起来这可能是由于更新导致的某种错误 (https://github.com/remy/nodemon/issues/1025)

我什至考虑过在 .listen 上添加某种回调,以便应用程序检查端口是否为 运行 (http://expressjs.com/en/5x/api.html#app.listen_path_callback)

但最终,不确定如何解决问题。谁能提供一些指导?

我的设置:

npm -v
1.5.0
node -v
v10.16.3
nodemon -v
v2.0.2
express -v
v4.16.0

当已有服务 运行 并获取该端口时会发生这种情况。

有时当您使用 Ctrl-c 退出应用程序时,进程不会完全终止并在后台保留 运行。

您可以使用此命令检查哪个进程正在获取您的端口

    netstat -tulnp | grep '<port number>'

看起来像这样^^

然后用上面命令提供的进程id杀死那个进程。

57997 in my case

您还可以使用 ps 命令检查后台是否已经有任何进程 运行。

添加类似

的内容
process.on(‘SIGINT’, () => { console.log(“exiting…“); process.exit(); });

process.on(‘exit’, () => { console.log(“exiting…“); process.exit(); });

在您的主 js 文件中应该捕捉到这些情况并允许您确保进程正确退出。您也可以扩展以调用一个函数来进行额外清理