4

nodejs でクエリ文字列パラメーターを使用してリクエストをプロキシするにはどうすればよいですか? 現在 Express と http-proxy を使用していますか?

Express と http-proxy モジュールを使用して、HTTP GET リクエストを私の側の特定のパスから、同じサーバー上で実行されているが別のポートで実行されているサードパーティの API にプロキシする nodejs アプリケーションがあります (したがって、同じオリジンの問題が発生し、プロキシー)。これは、クエリ文字列パラメーター、つまり「?name=value」を使用してバックエンド API で REST 関数を呼び出すまでは正常に機能します。その後、404 を取得します。

var express = require('express');
var app = express();
var proxy = require('http-proxy');
var apiProxy = proxy.createProxyServer();

app.use("/backend", function(req,res){
    apiProxy.web(req,res, {target: 'http://'+ myip + ':' + backendPort + '/RestApi?' + name + '=' + value});
});

Chrome のコンソールには次のように表示されます。

"GET http://localhost:8080/backend 404 (Not Found)"

注: 私は後でエクスプレスで他のものを使用しますが、プロキシ行の前ではなく、パスをルーティングするときに、より具体的なものからより一般的なものに移行します。バックエンドは、ブラウザで同じプロトコル://url:port/path?name=value を使用して問題なく直接アクセスできます。

4

4 に答える 4

7

req.urlクエリ文字列パラメーターを含むように変更し、ホスト名のみをapiProxy.web targetパラメーターに渡すことで、これを機能させました。

app.use('/*', function(req, res) {
    var proxiedUrl = req.baseUrl;
    var url = require('url');
    var url_parts = url.parse(req.url, true);
      if (url_parts.search !== null) {
        proxiedUrl += url_parts.search;
    }

    req.url = proxiedUrl;

    apiProxy.web(req, res, {
      target: app.host
    });
});
于 2015-02-03T16:52:36.517 に答える
0

これは私にとって非常に時間の無駄でした-(プロセスを強制終了して再起動します)

その後、 kill-port の使用を開始しましたが、エラーが発生しなくなりました

const express = require('express'),
    app = express(),
    bodyParser = require('body-parser'),
    kill = require('kill-port'),
    port = 5000;

const main = (req,res,app) => {
    // now you can start listening
    app.listen(port, function () {
        console.log('Server is running on port: ' + port);
    });
    // do stuff....
}

app.get("/myrest", (req, res) => {
    kill(port, 'tcp')
    .then(main(req,res,app))
    .catch(console.log);
});



于 2020-11-20T18:47:53.910 に答える