【问题标题】:nodejs EADDRINUSE errornodejs EADDRINUSE 错误
【发布时间】:2015-04-28 00:13:23
【问题描述】:

我开始使用 [cloud9][1] 并尝试托管我的 nodejs 应用程序。 当我尝试运行我的应用程序时,它会抛出以下错误:

重要提示:使用 process.env.PORT 作为端口,使用 process.env.IP 作为主机

Important: use process.env.PORT as the port and process.env.IP as the host in your scripts!                                                                            

debugger listening on port 15454                                                                                                                                       
8080                                                                                                                                                                   
0.0.0.0                                                                                                                                                                

events.js:72                                                                                                                                                           
        throw er; // Unhandled 'error' event                                                                                                                           
              ^                                                                                                                         
Error: listen EADDRINUSE                                                                                                                
    at errnoException (net.js:905:11)                                                                                                   
    at Server._listen2 (net.js:1043:14)                                                                                                 
    at listen (net.js:1065:10)                                                                                                          
    at Server.listen (net.js:1147:9)                                                                                                    
    at exports.lookup.callback (dns.js:72:18)                                                                                                                          
    at process._tickCallback (node.js:442:13)                                                                                                                          
    at Module.runMain [as _onTimeout] (module.js:499:11)                                                                                                               
    at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

我的 app.js:

var app = require('express')();
//var app = express();
//var http = require('http');
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.set('port', process.env.PORT || 3000);
var port = app.get('port');
console.log(port);
server.listen(port, process.env.IP);
// routing
app.get('/', function (req, res) {
    res.sendfile(__dirname + '/index.html');
});
// usernames which are currently connected to the chat
var usernames = {};
// rooms which are currently available in chat
var rooms = [];
io.sockets.on('connection', function (socket) {
    socket.on('adduser', function (username, room) {
        socket.username = username;
        socket.room = room;
        usernames[username] = username;
        socket.join(room);
        socket.emit('updatechat', 'SERVER', 'You are connected. Start chatting');
        socket.broadcast.to(room).emit('updatechat', 'SERVER', username + ' has connected to this room');
    });
    socket.on('createroom', function () {
        var new_room = (""+Math.random()).substring(2,7);
        rooms.push(new_room);
        socket.emit('updatechat', 'SERVER', 'Your room is ready, invite someone using this ID:' + new_room);
        socket.emit('roomcreated', new_room);
    });
    // when the client emits 'sendchat', this listens and executes
    socket.on('sendchat', function (data) {
        // we tell the client to execute 'updatechat' with 2 parameters
        io.sockets. in (socket.room).emit('updatechat', socket.username, data);
    });

    // when the user disconnects.. perform this
    socket.on('disconnect', function () {
        // remove the username from global usernames list
        delete usernames[socket.username];
        // update list of users in chat, client-side
        io.sockets.emit('updateusers', usernames);
        // echo globally that this client has left
        if(socket.username !== undefined){
            socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');
            socket.leave(socket.room);
        }
    });
});

我试图寻找任何已经在 8080 运行的进程,这是输出

user@chat_room:~/workspace (master) $ ps ax | grep node
14154 pts/1    S+     0:00 grep --color=auto node

如果我尝试使用其他端口,那么我没有得到套接字文件,它会抛出 404 错误:

<script src="/socket.io/socket.io.js"></script>

这在本地运行良好。

编辑 开放端口:

user@chat_room:~/workspace (master) $ netstat --listen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:mysql                 *:*                     LISTEN     
tcp        0      0 localhost:17123         *:*                     LISTEN     
tcp6       0      0 [::]:http-alt           [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     353035357 /tmp/tmux-1000/cloud91.8
unix  2      [ ACC ]     STREAM     LISTENING     351539622 /home/ubuntu/lib/mysql/socket/mysql.sock
unix  2      [ ACC ]     STREAM     LISTENING     352204732 /home/ubuntu/.c9/1312164/collab.sock


user@chat_room:~/workspace (master) $ netstat -vatn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:17123         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:37186         127.0.0.1:15455         TIME_WAIT  
tcp        0      0 127.0.0.1:15454         127.0.0.1:59371         TIME_WAIT  
tcp6       0      0 :::8080                 :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0    400 172.17.0.248:22         10.240.179.70:43154     ESTABLISHED


user@chat_room:~/workspace (master) $ netstat -vat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:mysql                 *:*                     LISTEN     
tcp        0      0 localhost:17123         *:*                     LISTEN     
tcp        0      0 localhost:37186         localhost:15455         TIME_WAIT  
tcp        0      0 localhost:15454         localhost:59371         TIME_WAIT  
tcp6       0      0 [::]:http-alt           [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
tcp6       0      0 user-chat_:ssh 10.240.179.70:43154     ESTABLISHED


user@chat_room:~/workspace (master) $ lsof -i
COMMAND     PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
mysqld     2316 ubuntu   10u  IPv4 351539621      0t0  TCP *:mysql (LISTEN)
apache2    2374 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2381 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2382 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2383 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2384 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
apache2    2385 ubuntu    4u  IPv6 351539675      0t0  TCP *:http-alt (LISTEN)
vfs-worke 13915 ubuntu   13u  IPv4 352221394      0t0  TCP localhost:17123 (LISTEN)

【问题讨论】:

  • 您使用什么命令启动 Node.js 服务器?

标签: javascript node.js port


【解决方案1】:

我会说错误说明了一切:

重要提示:在脚本中使用 process.env.PORT 作为端口,使用 process.env.IP 作为主机!

您的环境希望您将process.env.PORTprocess.env.IP 分别用于端口和ip(是cloud9 吗?),但在这一行中您使用的是另一个环境变量:

app.set('port', process.env.app_port || 8080)

修复:

app.set('port', process.env.PORT || 8080)

(一般来说,EADDRINUSE 错误是因为另一个进程正在监听该端口)

针对 404 错误

编辑:之前发布的代码是针对旧版本的 Express。见http://socket.io/docs/#using-with-express-3/4

【讨论】:

  • 谢谢,但我收到此错误:express has no method 'createServer' 根据此答案stackoverflow.com/a/13499302/608388 express server is deprecated。
  • @ntechi see socket.io/docs/#using-with-express-3/4 我发布的是旧版 express 的代码
  • 尝试过,如果尝试使用不同的端口,仍然会得到 404,如果使用app.set('port', process.env.PORT || 3000);,我的应用程序会出现错误,如果我在 8080 以外的端口上运行它,但套接字文件是 404 时,我的应用程序可以工作。请检查我的更新代码
  • 你能发布更新的代码吗?无论如何,要检查哪些端口正在使用:cyberciti.biz/faq/…
  • 添加了开放端口的输出
【解决方案2】:

是否有可能在您的代码中请求listen() 到源中两个位置的同一端口?我没有看到两个监听调用,但我对 express 或套接字不太熟悉,无法知道另一个函数是否执行此操作......它发生在我身上一次,尽管在不同的情况下。

【讨论】:

    【解决方案3】:

    使用命令列出在 8080 端口上运行的进程: lsof -i :8080, 通过使用正在运行的进程的 PID 使用命令杀死使用端口 8080 的实例: 杀死 -9 PID

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2016-03-03
      • 2016-07-12
      • 2018-12-24
      • 2017-08-14
      • 2013-01-16
      • 2017-11-14
      • 2017-07-28
      • 1970-01-01
      相关资源
      最近更新 更多