Express, http-proxy-middleware и net::ERR_CONNECTION_REFUSED

Я пытался отладить проблему, с которой у меня есть приложение Express, которое использует http-proxy-middleware для пересылки запросов в другую серверную службу. Существует приложение третьей части, которое вызывает мой сервер, отправляя запрос, который явно использует IP-адрес в URL-адресе, который он отправляет. При локальном запуске на моей машине для разработки он использует локальный IP-адрес машины (не localhost или loopback 127.0.0.1).

Я сократил свой сервер до абсолютного минимума и проксирую сервис, который просто отвечает пустым объектом JSON. Таким образом, все остальные факторы были удалены. Это просто простое экспресс-приложение и прокси.

Сервер

var express = require('express');
var proxyMiddleware = require('http-proxy-middleware');
var port = 4000;

var app = express();
var options = {
  target: 'http://jsonplaceholder.typicode.com',
  logLevel: 'debug'
}

var apiProxy = proxyMiddleware('/myportfolio', options);
app.use(apiProxy);

app.listen(port, 'localhost', (err) => {
  if (err) {
    console.log(err);
    process.exit(1);
  }

  // So we can see a message whilst it bundles
  console.log(`now running on port: ${port}\n`);
});

Мое приложение запускается и отображает сообщение

'сейчас работает в порту: 4000'

Я запускаю браузер и отправляю следующее:

http://localhost:4000/myportfolio

и получить

// 20161023082019
// http://localhost:4000/myportfolio
{
}

Что абсолютно нормально и ожидаемый ответ, пока все хорошо. Затем я могу переключиться на использование IP-адреса обратной связи

Когда я печатаю

http://127.0.0.1:4000/myportfolio

я получил

// 20161023082943
// http://127.0.0.1:4000/myportfolio
{
}

Однако, когда я использую

http://192.168.1.126:4000/myportfolio

Я ничего не получаю, и на вкладке Chrome network отображается следующая ошибка.

GET http://192.168.1.126:4000/myportfolio net::ERR_CONNECTION_REFUSED

и хром показывает, что стандартное сообщение не может соединиться.

This site can’t be reached
192.168.1.126 refused to connect.

Я проверил IP-адрес локальных машин и его правильность

Это то же самое, что "Сетевая утилита" говорит мне

и проверка адреса в терминале дает:

$ ifconfig | grep inet
inet 127.0.0.1 netmask 0xff000000 
inet6 ::1 prefixlen 128 
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
inet6 fe80::4c:3ebe:e51d:819f%en0 prefixlen 64 secured scopeid 0x4 
inet 192.168.1.126 netmask 0xffffff00 broadcast 192.168.1.255
inet6 fe80::18a8:e9ff:fe89:25e7%awdl0 prefixlen 64 scopeid 0x8 
inet6 fe80::694c:e86:8b39:47f7%utun0 prefixlen 64 scopeid 0xa 
inet6 fe80::45eb:e4b2:c242:48b%utun2 prefixlen 64 scopeid 0xc 
inet6 fe80::859:d69c:1aec:7a59%utun1 prefixlen 64 scopeid 0xb 
inet6 fe80::8d7:fd2c:e131:6832%utun3 prefixlen 64 scopeid 0xd 
$ 

а также

$ netstat -an | grep 4000
tcp4       0      0  127.0.0.1.4000         *.*                    LISTEN     
$

Стороннее программное обеспечение также вызывает то же самое net::ERR_CONNECTION_REFUSED (как и следовало ожидать), но так как у меня есть задача интегрировать его с моей разработкой, мне нужно найти решение этой проблемы вызова напрямую по IP, а не localhost или 127.0.0.1.

1 ответ

Решение

ОК, примерно через пару часов после обхода внутренней части и, наконец, просмотра списка проблем для промежуточного программного обеспечения.

ответ был довольно прост - мне просто нужно было открыть Express APP, передав другой хост (не обычный localhost)

app.listen(port, '0.0.0.0', (err) => {
  if (err) {
    console.log(err);
    process.exit(1);
  }

  // So we can see a message whilst it bundles
  console.log(`now running on port: ${port}\n`);
});

Я оставлю этот ответ здесь на случай, если он пригодится кому-то еще в будущем.

Я мог бы указать свой конкретный IP-адрес, но поскольку я использую DHCP, на данный момент достаточно "0.0.0.0"...

:)

Другие вопросы по тегам