我已经在一个node.js项目上工作了几个星期,它一直工作得很好。通常,我使用npm start来运行我的应用程序,并在localhost上的浏览器中查看它,端口3000。

今天,我在使用npm start时开始得到以下错误:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

我已经检查了资源监视器,我没有在端口3000上运行其他进程。我为什么会得到这个错误消息?

在我的app.js中,我有以下代码来设置端口…这是错误的吗?它以前工作得很好,所以我不确定我做错了什么。

// Set Port
app.set('port', (process.env.PORT || 3000));
app.listen(app.get('port'), function() {
    console.log('Server started on port '+app.get('port'));
});

谢谢你的帮助!


编辑:

我已经尝试运行netstat和TCPView来检查哪个进程正在使用该端口,但是没有使用该端口。我也尝试重新启动我的笔记本电脑,但我仍然得到同样的错误。


当前回答

如果只关闭一个端口,执行此命令即可。 Kill -9 $(lsof -t -i:3000)

pkill和kill的区别是某人在处理黏土。在kill中,你应用一个过滤器。你只要停你想停的端口。

pkill命令关闭所有节点进程。 Pkill -9节点

使用pkill可以避免在开发过程中偶尔发生的内存泄漏。如果有一个以上的节点,它会杀死所有的节点。

在包中使用脚本。Json也是一个例子。

"scripts": {
    "server:start": "cd server && yarn start",
    "server:restart": "cd server && yarn restart",
    "frontend:start": "cd frontend && yarn start",
    "frontend:restart": "kill -9 $(lsof -t -i:4200) && yarn start:frontend"
},
"scripts": {
    "start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts",
    "restart": "pkill -9 node && start",
    "kill": "pkill -9 node"
},

其他回答

在linux中很简单

打开终端 进程中的空闲端口 -> kill $(lsof -t -i:$port)

打开任务管理器(按Ctrl+Alt+Del 选择“流程选项卡” 搜索“Node.js:服务器端JavaScript” 选择它并单击“结束任务”按钮

也许你可以拿这个作参考。这个命令行可以终止在给定端口上运行的进程。

npx kill-port 3000


杀死多个端口。

npx kill-port 3000 8080 4200

终止拥有端口3000的进程

首先,让我们看看如何终止打开端口的进程。

使用lsof命令,我们可以检索具有给定端口的PID:

$ lsof -i :3000 -t
12345

然后我们可以通过这样做来终止这个进程:

$ kill 12345

让我们把它变成一行代码:

lsof -i 3000 -t | xargs kill

如果你使用环境变量来设置服务器端口,我们可以指定它,而不是硬编码我们的值:

lsof -i ${PORT} -t | xargs kill

最后,如果没有设置环境变量,我们可以默认端口3000:

lsof -i ${PORT:-3000} -t | xargs kill

没有恶魔来执行钩子

Nodemon允许你通过Nodemon设置事件钩子。Json配置文件:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}

这将导致nodemon在应用程序崩溃时执行sh -c 'lsof -i:${PORT:-3000} -t | xargs kill命令,从而杀死它所生成的保持端口打开的子进程。

或者你可以试试这个

fuser -k PORT-NO/tcp

Eg:

fuser -k 3000/tcp

你也可以试试这个

fuser -n tcp -k PORT-NO

Eg:

fuser -n tcp -k 3000

在MAC

kill -9 $(lsof -ti:PORT_NO)

Eg:

kill -9 $(lsof -ti:9229)

它可能是在后台运行的管理进程,netstat没有显示这一点。 使用任务列表| grep节点找到这个管理进程的PID,然后杀死PID