如何让Node.JS Express只在localhost上收听?

nak*_*nak 48 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)
Run Code Online (Sandbox Code Playgroud)

在没有指定主机名的情况下运行应用程序可以正常工作,即app.listen(3001);.

我正在运行Node v0.6.14并表达@ 2.5.5并已阅读此google小组讨论并在Express application.js中发现此评论说:"此方法采用与节点相同的参数http.Server#listen()."

谢谢你的帮助.

log*_*yth 53

感谢您的信息,我想我看到了问题.这是一个hive-go只会在您添加主机时显示的错误.它的最后几行是:

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

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

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

试试这个:

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


dgh*_*dgh 26

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

这在nodejs v0.6 +和Express v3.0 +中运行得很好.