0

http-proxy-middleware を使用してリクエストを別のバックエンド サービスに転送する Express App に関する問題をデバッグしようとしています。送信する 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`);
});

アプリケーションが起動し、メッセージが表示されます

「現在ポートで実行中: 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

クロムは、標準がメッセージを接続できないことを示しています。

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

ローカル マシンの IP アドレスとその正しい 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 ではなく IP で直接呼び出すというこの問題の修正を見つける必要があります。 localhost または 127.0.0.1。

4

1 に答える 1

2

約 2 時間内部を調べて、最後にミドルウェアの問題リストを調べた後、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」で十分です...

:)

于 2016-10-23T09:09:09.613 に答える