如何让Node.JS Express只听localhost?

我有一个应用程序,我有一个反向代理,我想它只听本地/ 127.0.0.1。

我期待这个工作:

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);

我正在运行Node v0.6.14并且expression了@ 2.5.5,并且已经阅读了这个谷歌小组的讨论,并且在Express application.js中发现了这个注释 :“这个方法和节点的http.Server#listen()有相同的参数。

谢谢你的帮助。

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

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

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

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

尝试这个:

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

您遇到此问题是因为您正在尝试在连接完成之前控制日志app.address()。 在连接完成之后,您必须确保控制台日志,即在callback中,或者在事件发出信号指示连接已经完成之后。

幸运的是,侦听事件是在连接完成后由服务器发出的,只需要这样做:

 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); }); 

这在nodejs v0.6 +和Express v3.0 +中工作得很好。