【问题标题】:In nodejs trying to get http-proxy to forward requests passing through query string parameters在nodejs中试图让http-proxy转发通过查询字符串参数的请求
【发布时间】:2014-11-24 14:40:26
【问题描述】:

如何在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 没有问题。

【问题讨论】:

  • 我遇到了同样的问题。你找到解决办法了吗?
  • @Laoujin 还没有解决办法。我解决了这个问题,而不是修复它。我真的应该去看看 http-proxy 代码并找到问题,我很确定它应该支持这个用例。

标签: node.js proxy http-proxy node-http-proxy


【解决方案1】:

我通过更改 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
    });
});

【讨论】:

    【解决方案2】:

    2017 年更新

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

    app.use('/api', function(req, res) {
    
      req.url = req.originalUrl    //<-- Just this!
    
      apiProxy.web(req, res, {
        target: {
          host: 'localhost',
          port: 8080
        }
      })
    

    【讨论】:

      【解决方案3】:

      使用以下将查询字符串参数附加到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
          }
       })
      

      【讨论】:

        【解决方案4】:

        这对我来说太浪费时间了 - (杀死进程并重新启动)

        然后我开始使用 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);
        });
        
        
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-04
          • 2016-07-09
          • 1970-01-01
          相关资源
          最近更新 更多