2012-04-09 86 views
31

我有一个应用程序,我有一个反向代理,我希望它只听本地/ 127.0.0.1。如何让Node.JS Express只在本地主机上侦听?

我预计这个工作:

app.listen(3001, 'localhost');

app.listen(3001, '127.0.0.1');

...而是我得到一个错误:

node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot read property 'port' of null 
    at Object.<anonymous> (/home/ctoledo/hive-go/go.js:204:76) 
    at Module._compile (module.js:441:26) 
    at Object..js (module.js:459:10) 
    at Module.load (module.js:348:31) 
    at Function._load (module.js:308:12) 
    at Array.0 (module.js:479:10) 
    at EventEmitter._tickCallback (node.js:192:40) 

不运行应用程序一个指定的主机名正常工作,即app.listen(3001);

我运行的节点v0.6.14和表达@2.5.5,并已阅读本google groups discussion,并已发现this comment Express中的application.js说:“这个方法有相同的参数作为节点的http.Server#listen()

感谢您的任何帮助。

+0

你可以给堆栈跟踪错误吗?只是给文本不是很有用。 – loganfsmyth 2012-04-09 04:00:47

+0

编辑的问题 – nak 2012-04-09 04:29:53

+0

这是'204'行'go.js'文件中的错误。那条线是干什么的?你应该多一点代码? – loganfsmyth 2012-04-09 04:33:53

回答

34

感谢您的信息,认为我看到了问题。这是仅在添加主机时才显示的hive-go中的错误。它的最后一行是:

app.listen(3001); 
console.log("... port %d in %s mode", app.address().port, app.settings.env); 

当你在第一行添加主机,它是当它调用app.address().port崩溃。

问题是.listen()的潜在异步性质。真的应该是在console.log的调用里面传递一个回调来监听。当您添加主机时,它会尝试执行DNS查找,这是异步的。因此,当该线路尝试获取地址时,因为DNS请求正在运行,所以还没有一个,所以它崩溃了。

试试这个:

app.listen(3001, 'localhost', function() { 
    console.log("... port %d in %s mode", app.address().port, app.settings.env); 
}); 
+0

谢谢,我评论了console.log ...异步警告只是没有发生在我身上,欢呼! – nak 2012-04-09 05:15:54

21

,因为你正试图控制台登录app.address()已建立连接之前,你有这个问题。您必须确保在建立连接后进行控制台日志记录,即在回调中或事件发出信号后表示已建立连接。

幸运的是,“听”事件是由服务器发出的连接之后这样只是这样做:

var express = require('express'); 
var http = require('http'); 

var app = express(); 
var server = http.createServer(app); 

app.get('/', function(req, res) { 
    res.send("Hello World!"); 
}); 

server.listen(3000, 'localhost'); 
server.on('listening', function() { 
    console.log('Express server started on port %s at %s', server.address().port, server.address().address); 
}); 

这个作品在V0.6的NodeJS +和快递V3.0 +就好了。

相关问题