用Heroku nodejs服务器错误EADDRNOTAVAIL

我已经在OpenShift上开发了一个nodejs服务器,现在我正在试图在Heroku上为一个新项目制作相同types的服务器。

这是我的服务器的最小代码:

var http = require('http'); var port = process.env.PORT || 8080; var address = process.env.IP || '127.0.0.1'; console.log(address); console.log(port); var server = http.createServer(function(req, res) { res.writeHead(200, { 'Content-Type': 'text/html', 'Access-Control-Allow-Origin': '*' }); res.write(JSON.stringify({ valid: true })); res.end(); }); server.listen(port, address); 

与我的OpenShift服务器的差异是:

  • 通过process.env.PORT和process.env.IPreplacevariablesprocess.env.OPENSHIFT_NODEJS_PORT,process.env.OPENSHIFT_NODEJS_IP。
  • 我用这个命令行设置IPvariables:heroku config:set IP = MYSERVERADDRESS.com

我无法启动我的服务器,它总是崩溃,我不明白为什么,我的服务器的日志是:

 MYSERVERADDRESS.com 41184 events.js:154 throw er; // Unhandled 'error' event ^ Error: listen EADDRNOTAVAIL MYSERVERIP:41184 at Object.exports._errnoException (util.js:893:11) at exports._exceptionWithHostPort (util.js:916:20) at Server.__dirname.Server.Server._listen2 (net.js:1233:19) at net.js:1391:9 at GetAddrInfoReqWrap.asyncCallback [as callback] (dns.js:63:16) at listen (net.js:1282:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:82:10) 

我的猜测是你的Heroku服务器不会把你的(外部)服务器地址作为它的(内部)IP号码(外部IP地址很可能会在Herokunetworking堆栈的早期终止),这意味着你不能显式地监听(这基本上是EADDRNOTAVAIL意思)。

相反,不要使用地址来听:

 server.listen(port);