我已经在一个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来检查哪个进程正在使用该端口,但是没有使用该端口。我也尝试重新启动我的笔记本电脑,但我仍然得到同样的错误。


当前回答

这是一个老问题,但似乎没有一个回复者真正读过它。我也遇到过同样的问题,问题是Windows有时会保留端口块并阻止你使用它们。该端口不会通过netstat或任何其他工具显示。你可以在这里阅读:

从本质上讲,你可以告诉Windows离开你的端口:

netsh int ipv4 add excludedportrange tcp startport=3000 numberofports=1 store=persistent

其他回答

这很简单。你可以用2个简单的步骤来修复它。

如果有名为“PORT”的键/项,请检查环境变量。 如果发现,删除该条目或将其重命名为其他内容。

结果是其他程序在使用这个变量。通常当你启动react-scripts时,它会寻找一个标题为PORT的环境变量。

这是一个老问题,但似乎没有一个回复者真正读过它。我也遇到过同样的问题,问题是Windows有时会保留端口块并阻止你使用它们。该端口不会通过netstat或任何其他工具显示。你可以在这里阅读:

从本质上讲,你可以告诉Windows离开你的端口:

netsh int ipv4 add excludedportrange tcp startport=3000 numberofports=1 store=persistent

我已经解决了这个问题,因为MongoDB或有另一个应用程序,你之前在这个端口上运行它, 为了解决这个问题,从任务管理器中关闭进程, 或者将端口的编号从3000更改为任何其他端口。

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

终止拥有端口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)