#javascript #node.js #express #proxy #http-proxy-middleware
#javascript #node.js #экспресс #прокси #http-прокси-промежуточное программное обеспечение
Вопрос:
Я пытался отладить проблему, с которой у меня есть приложение Express, которое использует http-прокси-промежуточное программное обеспечение для пересылки запросов в другую серверную службу. Существует приложение третьей части, которое вызывает мой сервер, отправляя запрос, который явно использует IP-адрес в отправляемом URL-адресе. При локальном запуске на моей машине разработки он использует локальный IP-адрес машины (не localhost или обратный цикл 127.0.0.1).
Я вернул свой сервер к абсолютному минимуму и подключаюсь к сервису, который просто отвечает пустым объектом JSON. Таким образом, все остальные факторы были устранены. Это всего лишь простое приложение express и прокси.
Сервер
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 отображается следующая ошибка
GET http://192.168.1.126:4000/myportfolio net::ERR_CONNECTION_REFUSED
и chrome показывает стандартное сообщение не удается подключиться.
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. следует проверить, блокирует ли ваш брандмауэр / av соединения.
Ответ №1:
Хорошо, примерно через пару часов поиска внутреннего и, наконец, просмотра списка проблем для промежуточного программного обеспечения
ответ был довольно простым — мне просто нужно было открыть приложение Express, передав другой хост (не обычный ‘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’ …
🙂