57

我有一个在反向代理后面的应用程序,我希望它只收听 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和 express@ 2.5.5并阅读了这个google groups 讨论,并在 Express application.js 中找到了这条评论:“这个方法采用与节点相同的参数http.Server#listen()。”

谢谢你的帮助。

4

2 回答 2

65

感谢您的信息,我想我看到了问题。这是一个错误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);
});
于 2012-04-09T05:02:24.647 回答
30

您遇到此问题是因为您在建立连接之前尝试控制台日志 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);
});

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

于 2012-07-19T05:21:45.777 回答