4

如何在 nodejs 中使用查询字符串参数代理请求,我目前正在使用 express 和 http-proxy?

我有一个 nodejs 应用程序,使用 express 和 http-proxy 模块将 HTTP GET 请求从我端的某些路径代理到在同一服务器上运行但不同端口的第三方 API(因此遇到相同的来源问题,需要代理人)。这工作正常,直到我想使用查询字符串参数(即“?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)"

注意:我稍后会在 express 中使用其他东西,但不会在代理行之前使用,并且在路由路径时我从更具体到更一般。可以使用相同的协议直接在浏览器中访问后端://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 回答
4

2017 更新

要代理请求参数查询字符串,请传递 Express v4originalUrl属性:

app.use('/api', function(req, res) {

  req.url = req.originalUrl    //<-- Just this!

  apiProxy.web(req, res, {
    target: {
      host: 'localhost',
      port: 8080
    }
  })
于 2017-05-10T23:07:53.397 回答
0

使用以下内容将查询字符串参数附加到req.url

app.use('/api', function(req, res) {

  var qs = require("qs"); 

  req.url = qs.stringify(req.query, {
    addQueryPrefix: true
  });

  apiProxy.web(req, res, {
    target: {
      host: 'localhost',
      port: 8080
    }
 })
于 2019-10-31T06:43:56.963 回答
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 回答