在监听process.env.PORT时,heroku应用程序崩溃

时间:2014-11-08 18:14:13

标签: node.js heroku express

当我在heroku上部署它时:

app.js

var port = process.env.PORT || 8080;

app.listen(port, function(){
    console.log("Listening on port : " + port);
});

我收到错误日志:

2014-11-08T18:05:34.300115+00:00 app[web.1]: events.js:72
2014-11-08T18:05:34.300402+00:00 app[web.1]:         throw er; // Unhandled 'error' event
2014-11-08T18:05:34.300404+00:00 app[web.1]:               ^
2014-11-08T18:05:34.303599+00:00 app[web.1]: Error: listen EADDRINUSE
2014-11-08T18:05:34.303605+00:00 app[web.1]:     at errnoException (net.js:904:11)
2014-11-08T18:05:34.303607+00:00 app[web.1]:     at Server._listen2 (net.js:1042:14)
2014-11-08T18:05:34.303608+00:00 app[web.1]:     at listen (net.js:1064:10)
2014-11-08T18:05:34.303610+00:00 app[web.1]:     at Server.listen (net.js:1138:5)
2014-11-08T18:05:34.303628+00:00 app[web.1]:     at Function.app.listen (/app/node_modules/express/lib/application.js:556:24)
2014-11-08T18:05:34.303629+00:00 app[web.1]:     at Object.<anonymous> (/app/bin/www:7:18)
2014-11-08T18:05:34.303630+00:00 app[web.1]:     at Module._compile (module.js:456:26)
2014-11-08T18:05:34.303632+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:474:10)
2014-11-08T18:05:34.303633+00:00 app[web.1]:     at Module.load (module.js:356:32)
2014-11-08T18:05:34.303635+00:00 app[web.1]:     at Function.Module._load (module.js:312:12)

但是当我直接在端口8080上听它工作时,我无法理解为什么:

var port = 8080;
    app.listen(port, function(){
        console.log("Listening on port : " + port); //it work
    });

我刚刚开始使用nodejs,但我真的不明白为什么会崩溃。

有人可以解释其原因或如何调试&#34;此?

谢谢!

2 个答案:

答案 0 :(得分:4)

好的,问题是express-generator创建了一个/ bin / www文件,其中包含:

#!/usr/bin/env node
var debug = require('debug')('toto');
var app = require('../app');

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

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

这就是为什么端口已被使用。

由于

答案 1 :(得分:1)

错误&#34; EADDRINUSE&#34;意味着某些东西已经在听这个端口了。

我猜你的机器上没有任何东西正在听8080,这就是为什么它直接设置它的原因。

使用console.log(process.env.PORT)打印您尝试收听的端口。 然后使用netstat -tunap检查正在侦听此端口的程序,您应该收到与此类似的内容:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN 3425/inetd

tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 3640/X

tcp 0 0 0.0.0.0:113 0.0.0.0:* LISTEN 3425/inetd

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7586/sshd

杀死相关程序,然后重试。

要调试nodejs,我建议使用node-inspector,非常容易使用,它使用chrome开发人员工具ui。