javascript - 在转发到代理目标并将响应发送回客户端之前编辑 POST 参数

标签 javascript node.js express proxy

我有一个 Node/快速代理设置,使用 http-proxy-middleware 将请求路由到 java-tomcat Web 服务(代理目标)。

在将请求转发到代理目标之前,我需要将 POST 表单数据注入(inject)上下文类型为“application/x-www-form-urlencoded”的请求 rawbody。在将响应发送到客户端之前,代理响应需要删除相同的 post 参数。

我使用了许多不同的代理,包括 http-proxy、http-proxy-middleware、node-proxy 和 express-proxy,但这些模块似乎都没有允许 POST 参数操作的可用解决方案

这个问题最初发布于 https://github.com/chimurai/http-proxy-middleware/issues/61#issuecomment-205494577

'use strict';

var express = require('express');
var router = express.Router();
//var request = require("request");

var proxy_filter = function (path, req) {
    return path.match('^/report') && ( req.method === 'GET' ||    req.method === 'POST' );
};

var proxy_options = {
    target: 'http://localhost:8080',
    logLevel: 'debug',
    //logProvider:
    onError(err, req, res) {
        res.writeHead(500, {
            'Content-Type': 'text/plain'
        });
        res.end('Something went wrong. And we are reporting a custom error message.' + err);
    },
    onProxyRes(proxyRes, req, res) {
        //proxyRes.headers['x-added'] = 'foobar';     // add new header to response
        //delete proxyRes.headers['x-removed'];       // remove header from response
    },
    onProxyReq(proxyReq, req, res) {
        if ( req.method == "POST" && req.body ) {
            proxyReq.write( encodeURIComponent( JSON.stringify(   req.body ) ) );
            proxyReq.end();
        }
    }
};

// Proxy configuration
var proxy = require( 'http-proxy-middleware' )( proxy_filter, proxy_options );

/* GET home page. */
router.get('/', function(req, res, next) {
    res.render('index', { title: 'Node.js Express Proxy Test' });
});

router.all('/report/*', function( req, res, next ) {

    //req.body.jdbc_sas = 'jdbc:postgresql://pg_dev:5432/sasdb';
    //req.body.jdbc_agency = 'jdbc:postgresql://pg_dev:5432/agency0329';
    //console.log('proxy body:',req.body);

    proxy( req, res, next );
} );

module.exports = router;

非常感谢任何建议。

恭敬地,

沃伦。

最佳答案

好的,这是最终的解决方案。

以下示例允许您在转发到代理目标之前注入(inject) POST 参数。您没有从代理目标响应中清除任何参数 - 据我所知 - 因为它保留了原始 POST 请求的副本。

附带说明一下,这还允许 http-proxy-middleware 与 body-parser 一起工作。

示例 Node 快速路由文件:

'use strict';

var express = require('express');
var router = express.Router();

var proxy_filter = function (path, req) {
    return path.match('^/docs') && ( req.method === 'GET' || req.method === 'POST' );
};

var proxy_options = {
    target: 'http://localhost:8080',
    pathRewrite: {
        '^/docs' : '/java/rep/server1' // Host path & target path conversion
    },
    onError(err, req, res) {
        res.writeHead(500, {
            'Content-Type': 'text/plain'
        });
        res.end('Something went wrong. And we are reporting a custom error message.' + err);
    },
    onProxyReq(proxyReq, req, res) {
        if ( req.method == "POST" && req.body ) {
            // Add req.body logic here if needed....

           // ....

            // Remove body-parser body object from the request
            if ( req.body ) delete req.body;

            // Make any needed POST parameter changes
            let body = new Object();

            body.filename = 'reports/statistics/summary_2016.pdf';
            body.routeid = 's003b012d002';
            body.authid = 'bac02c1d-258a-4177-9da6-862580154960';

            // URI encode JSON object
            body = Object.keys( body ).map(function( key ) {
                return encodeURIComponent( key ) + '=' + encodeURIComponent( body[ key ])
            }).join('&');

            // Update header
            proxyReq.setHeader( 'content-type', 'application/x-www-form-urlencoded' );
            proxyReq.setHeader( 'content-length', body.length );

            // Write out body changes to the proxyReq stream
            proxyReq.write( body );
            proxyReq.end();
        }
    }
};

// Proxy configuration
var proxy = require( 'http-proxy-middleware' )( proxy_filter, proxy_options );

/* GET home page. */
router.get('/', function(req, res, next) {
    res.render('index', { title: 'Node.js Express Proxy Test' });
});

router.all('/document', proxy );

module.exports = router;

关于javascript - 在转发到代理目标并将响应发送回客户端之前编辑 POST 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36416129/

相关文章:

javascript - 使用 Math.Round 获取可被 5 整除的数字

javascript - Express中的JS运行时错误

node.js - 在 node.js 中,如何使用 socket.io 和 express 设置 redis?具体使用 RedisStore()

javascript - 修改obj javascript中的项目

node.js - 在heroku上部署Nodejs+Express+React+Webpack应用程序

javascript - d3力布局初始结构

javascript - 为什么我无法访问 document.querySelectorAll 的某些元素

javascript - 2 Collection.find 超出了最大调用堆栈大小

node.js - 有没有办法在维护数据的同时更改 mongoDB 结构(从嵌套/嵌入文档到对象引用列表)?

c# - node.js 与 C# 中的网络爬虫性能