javascript nodejs EADDRINUSE 错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28728548/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
nodejs EADDRINUSE error
提问by Niraj Chauhan
I started using [cloud9][1] and trying to host my nodejs app. When I try to run my app it is throwing me following error:
我开始使用 [cloud9][1] 并尝试托管我的 nodejs 应用程序。当我尝试运行我的应用程序时,它抛出以下错误:
Important: use process.env.PORT as the port and process.env.IP as the host in your
重要提示:使用 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)
My app.js:
我的 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);
}
});
});
I tried looking for any process already running at 8080, this is the output
我尝试寻找任何已经在 8080 上运行的进程,这是输出
user@chat_room:~/workspace (master) $ ps ax | grep node
14154 pts/1 S+ 0:00 grep --color=auto node
If I try using other port then I am not getting socket file, it throws me 404 error:
如果我尝试使用其他端口,则无法获取套接字文件,它会引发 404 错误:
<script src="/socket.io/socket.io.js"></script>
<script src="/socket.io/socket.io.js"></script>
This works fine in local.
这在本地工作正常。
EDITOpen ports:
编辑开放端口:
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)
采纳答案by ItalyPaleAle
I would say the error said it all:
我会说错误说明了一切:
Important: use process.env.PORT as the port and process.env.IP as the host in your scripts!
重要提示:在脚本中使用 process.env.PORT 作为端口和 process.env.IP 作为主机!
Your environment wants you to use process.env.PORTand process.env.IPfor port and ip respectively (is that cloud9?), but on this line you're using another environmental variable:
您的环境希望您分别使用process.env.PORT和process.env.IP端口和 ip(那是 cloud9 吗?),但在这一行中,您使用了另一个环境变量:
app.set('port', process.env.app_port || 8080)
Fix:
使固定:
app.set('port', process.env.PORT || 8080)
(In general, the EADDRINUSE error is for when another process is listening to that port)
(一般来说,EADDRINUSE 错误是因为另一个进程正在侦听该端口)
For the 404 error
对于 404 错误
EDIT: the code posted before was for an old version of Express. See http://socket.io/docs/#using-with-express-3/4
编辑:之前发布的代码是针对旧版 Express 的。见http://socket.io/docs/#using-with-express-3/4
回答by Kit
Is it possible in your code that you're requesting to listen()to the same port at two locations in your source ? I don't see two listen calls, but I'm not that familiar with express or sockets to know if another function does this... it happened to me once though in a different situation.
在您的代码中,您是否有可能请求访问listen()源代码中两个位置的同一个端口?我没有看到两个监听调用,但我对 express 或 sockets 不太熟悉,不知道另一个函数是否会这样做……尽管在不同的情况下发生过一次。
回答by Abdul Sadik P
List the processes running on the port 8080 by using command: lsof -i :8080, By using the PID of running processes Kill the instance which uses port 8080 by using command: kill -9 PID
使用命令列出运行在8080端口的进程:lsof -i :8080,使用运行进程的PID 使用命令杀死使用8080端口的实例:kill -9 PID

