Подтвердить что ты не робот

Как получить Node.JS Express для прослушивания только на localhost?

У меня есть приложение, которое у меня есть за обратным прокси, я бы хотел, чтобы он слушал только 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 и нашли этот комментарий в Express application.js, говорящий: "Этот метод принимает те же аргументы, что и Node http.Server#listen()".

Спасибо за любую помощь.

4b9b3361

Ответ 1

Спасибо за информацию, думаю, я вижу проблему. Это ошибка в 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);
});

Ответ 2

У вас возникла эта проблема, потому что вы пытаетесь настроить консоль log 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 +.