Express, http-proxy-middleware and net::ERR_CONNECTION_REFUS



我一直在尝试调试一个问题,我有一个使用http代理中间件将请求转发到另一个后端服务的快速应用程序。第三部分应用程序通过发出请求来调用我的服务器,该请求显式地使用它发送的URL中的IP地址。当在我的开发机器上本地运行时,它使用机器的本地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`);
});

我的应用程序启动并显示消息

' port: 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地址,它是正确的

和"Network Utility"告诉我的是一样的

和检查终端地址给出:

$ 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。

OK,经过几个小时的内部搜索,最终查看了中间件的问题列表

答案很简单——我只需要通过传入一个不同的主机(不是通常的'localhost')来打开Express APP

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'上,现在就足够了…

:)

最新更新