Node.js Express和Socket.IO端口3000已被占用。

14

我一直在按照这个教程(http://socket.io/get-started/chat/) 学习如何使用socket.io制作简单的聊天应用。

然而,我尝试使用Express来创建它,但我想知道为什么端口3000已经被占用?除非我更改端口号,否则下面的代码将无法工作。

/* Make the http server listen on port 3000. */
http.listen(3000, function(){
 console.log('listening on *:3000');
});

Express是否使用端口进行路由或其他操作?有没有简单的方法查找该端口上正在发生的事情?

我可能在我的require事物中做了一些不可靠的事情:

var express = require('express');
var app = require('express')();
var http = require('http').Server(app);
var router = express.Router();
var io = require('socket.io')(http);

谢谢。


你之前运行的程序还在运行中吗?这很有可能,特别是如果除了3000端口外的其他端口都可以工作。 - Aaron Dufour
@himahimahima 你用的是 Mac OS X 还是 Linux?尝试使用 sudo lsof -i | grep 3000 命令检查是否有其他服务正在使用该端口,如果有,请将其关闭。 - Daniel Le
@DanielLe 我在一台Linux机器上 - 我已经尝试过使用"sudo lsof -i | grep 3000",但都没有显示任何东西。 - himahimahima
@himahimahima 最简单的解决方案是重新启动您的计算机,或更改您的代码以使用不同的端口。 - Daniel Le
抱歉打扰一个旧的线程 - 但是重新启动您的机器真的是最简单的解决方案吗?理想情况下,当服务器收到 kill 命令时,代码应该总是清理/关闭服务器。有没有办法做到这一点? - GrayedFox
GrayedFox,看这个。虽然我应该补充一下,在Mac OSX上它对我没有用:https://dev59.com/8GAg5IYBdhLWcg3wu87o - Nitzan Wilnai
8个回答

27
我也遇到了这个问题,我通过以下方式解决它:
不要使用“npm start”来启动您的 Web 应用程序
改用“node app.js”

1
当我尝试同时处理多个express.js应用程序时,遇到了类似的问题(它们都试图使用端口3000)。同样,"node app.js"也解决了这个问题。 - Eduardo Casas

12

尝试运行:

netstat -anp tcp | grep 3000

这应该可以显示正在使用端口3000的进程名称。这里是StackOverflow上涵盖此问题更深入的另一个问题


2
嗯,似乎没有任何东西在使用它。一定是在应用程序内部某个地方。 - himahimahima
这对我没有任何返回值。我正在运行Mac OS Sierra。 - Julius

4
在开发过程中,最好的方法之一是通过IDE进行全面的调试和代码步骤。如果您使用WebStorm,则可以这样做。从运行配置 ->编辑配置 -> Nods.js并将app.js添加为节点参数。有关更多详细信息,请参见下面截图中的箭头。enter image description here

我碰巧正在使用WebStorm,所以这对我来说是解决方案,谢谢! - Mike Kuenzi

2

与上面不使用npm start的答案类似。

我正在使用nodemon和expressjs以及expressjs生成器。 我使用nodemon执行npm start,而npm start本身执行node ./NodeApp/bin/www

所以我进行了编辑,使nodemon自己执行node ./NodeApp/bin/www,这个错误就消失了。

结论

之前的

package.json

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./NodeApp/bin/www",
    "build": "webpack --watch",
    "dev": "nodemon --exec npm start"
},

之后

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --watch",
    "dev": "nodemon --exec node ./NodeApp/bin/www"
},

现在我使用npm run dev运行我的服务器,不再出现错误。


2

我通过以下方法解决了使用express应用程序时的同样问题:

  1. 编辑文件 "yourap/bin/www"
  2. 找到以下行:

    var port = normalizePort(process.env.PORT || '3000');

  3. 将其替换为:

    var port = normalizePort('XXXX');

其中 XXXX 是您想要使用的端口号。

然后,您可以自由地执行npm start! xD


2

我(忘记自己)之前安装了 ntop,默认也使用端口3000,因此遇到了与本文描述相同的错误。

正如其他人提到的那样,使用 netstat 或 lsof 查找有问题的服务(并在命令前加上 sudo,以获取正确的进程名称):

sudo lsof -P | grep ':3000'

- 或 -
sudo netstat -anp tcp | grep 3000

在Ubuntu上,服务被禁用(简单地)使用以下命令:
service ntop stop

0
我通过以下方式解决了这个问题:
npm install shelljs
在开始监听端口之前,加入代码以杀死nodejs进程。
var shell = require('shelljs');
shell.exec("pkill nodejs");
shell.exec("pkill node");

/* Make the http server listen on port 3000. */
http.listen(3000, function(){
 console.log('listening on *:3000');
});

-1

对我来说,使用3000 || 3333有所帮助,并且它修复了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接