在nodejs中试图让http-proxy转发通过查询字符串参数的请求

时间:2014-11-24 14:40:26

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

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

我有一个使用express和http-proxy模块的nodejs应用程序将HTTP GET请求从我的端点上的某些路径代理到在同一服务器上运行的第三方API但是具有不同的端口(因此遭受同一原因问题) ,需要代理)。这工作正常,直到我想在后端API上使用查询字符串参数调用REST函数,即"?name = value"。然后我得到了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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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
    }
  })

答案 2 :(得分: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
    }
 })

答案 3 :(得分: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);
});