我有一个反向代理背后的应用程序,我希望它只能侦听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 并表达@ 2.5.5 并已阅读此google groups discussion并在Express应用程序中找到了this comment .js说:“此方法采用与节点http.Server#listen()
相同的参数。”
感谢您的帮助。
答案 0 :(得分:50)
感谢您的信息,我想我看到了问题。这是hive-go
中的一个错误,只有在您添加主机时才会显示。最后一行是:
app.listen(3001);
console.log("... port %d in %s mode", app.address().port, app.settings.env);
当您在第一行添加主机时,它会在调用app.address().port
时崩溃。
问题是.listen()
的潜在异步性质。真的应该在传递给listen的回调中进行console.log
调用。添加主机时,它会尝试执行DNS查找,即异步。因此,当该行尝试获取地址时,还没有一个因为DNS请求正在运行,因此它崩溃了。
试试这个:
app.listen(3001, 'localhost', function() {
console.log("... port %d in %s mode", app.address().port, app.settings.env);
});
答案 1 :(得分:25)
您遇到此问题是因为您尝试在建立连接之前控制日志app.address()。您必须确保在建立连接后控制日志,即在回调中或在发出连接信号的事件之后。
幸运的是,连接完成后,服务器会发出'listening'事件,所以只需执行此操作:
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 +。
中工作得很好