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.PORT
and process.env.IP
for 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