我已经在一个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来检查哪个进程正在使用该端口,但是没有使用该端口。我也尝试重新启动我的笔记本电脑,但我仍然得到同样的错误。
Try opening the localhost in your browser. Just type: localhost:3000 in the address bar.
If the app opens-up, it means your previous npm run is still active. Now, you can just make changes to the code and see the effects if you are designing the same app, or if you wanna run another app, just tweak the code (in index.js of previously running app) a little-bit and (probably refresh the browser tab) to make it crash ;)..... Now go run npm run start again from your new app directory. Hope this helps! :)
or
你可以打开任务管理器(WINDOWS_KEY+X >任务管理器),你会看到“Node.js:服务器端JavaScript”行。选择它并结束任务....现在应该可以工作了!!
如果不是,将应用程序的.env文件更改为包含端口:3002并运行新应用程序。这将允许您在不同的端口上运行两个独立的应用程序。干杯! !
如果只关闭一个端口,执行此命令即可。
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"
},
终止拥有端口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)
我在NodeJS上使用nodemon快速服务器。
我收到以下消息,这似乎是一个错误:
$ node ./bin/www
Port 3000 is already in use
有一个通用的解决方案,如果您终止所有节点服务器连接,则可以在包中添加此代码。json文件:
"scripts": {
"start": "node ./bin/www",
"stop": "taskkill -f -im node.exe"
},
此外,我还找到了几个解决方案,windows命令和bash在win10 x64。
我所有的笔记都在这里:
#终止所有NodeJS服务器连接
$ taskkill -f -im node.exe
SUCCESS: The process "node.exe" with PID 14380 has been terminated.
SUCCESS: The process "node.exe" with PID 18364 has been terminated.
SUCCESS: The process "node.exe" with PID 18656 has been terminated.
#示例:打开Windows任务管理器,查看Windows上的“node.exe”PID编号
>> Command Line
$ netstat /?
$ netstat -a -n -o
$ netstat -ano
#根据端口号杀死Windows进程(示例)
寻求帮助:
$ taskkill /?
$ tskill /?
代码1:
$ taskkill -pid 14228
ERROR: The process with PID 14228 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).
代码2:
$ taskkill -f -pid 14228
SUCCESS: The process with PID 14228 has been terminated.
代码3:
$ tskill 14228
#查看特定端口的命令行
在cmd:
$ netstat -ano | find "14228"
在bash中:
$ netstat -ano | grep "14228" or $ netstat -ano | grep 14228
使用tasklist命令找到node.exe
在cmd:
$ tasklist | find "node"
在bash中:
$ tasklist | grep node
$ tasklist | grep node.exe
node.exe 14228 Console 2 48,156 K
node.exe 15236 Console 2 24,776 K
node.exe 19364 Console 2 24,428 K
我最近在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
大多数排除端口被释放,这些端口可以使用。
只是想提一个已经给出的答案没有涵盖的问题。它与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