我已经在一个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来检查哪个进程正在使用该端口,但是没有使用该端口。我也尝试重新启动我的笔记本电脑,但我仍然得到同样的错误。
只是想提一个已经给出的答案没有涵盖的问题。它与Hyper-V(和Docker)有关“窃取”端口:
摘自Docker问题(链接如下):
禁用hyper-v(这需要重新启动几次)
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
当您完成所有必需的重新启动时,保留您想要的端口,这样hyper-v就不会再保留它
netsh int ipv4 add excludedportrange protocol=tcp startport=3000 numberofports=1
重新启用hyper-V(这需要重新启动几次)
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
https://github.com/docker/for-win/issues/3171#issuecomment-459205576
我最近在win10上遇到了一个奇怪的端口问题,无法在端口8080上启动服务器进程监听,我把它改成了18080,然后它就工作了,但过了一段时间,同样的问题又出现了。
但是我找不到任何进程使用端口,我已经尝试了currpots和netstat,没有一个工作,我尝试了开放端口
python -m http.server 18080
python -m http.server 18081
python -m http.server 18082
python -m http.server 18083
python -m http.server 18084
...
,大多数人说类似的信息“端口已经在使用”
幸运的是,我找到了原因。通过
netsh interface ipv4 show excludedportrange protocol=tcp
可以看出有些端口是排除使用的,通过这些端口没有打开和监听。
并通过
net stop winnat
大多数排除端口被释放,这些端口可以使用。
终止拥有端口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)