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

Javascript 在转发到代理目标并将响应发送回客户端之前编辑POST参数,javascript,node.js,express,proxy,Javascript,Node.js,Express,Proxy,我有一个node/express代理设置,使用http代理中间件将请求路由到JavaTomcatWeb服务(代理目标) 在将请求转发到代理目标之前,我需要使用上下文类型“application/x-www-form-urlencoded”将POST表单数据注入请求rawbody。在将响应发送到客户端之前,代理响应需要删除相同的post参数 我使用了许多不同的代理,包括http代理、http代理中间件、节点代理和express代理,但这些模块似乎都没有一个解决方案可用于后期参数操作 这个问题最初发

我有一个node/express代理设置,使用http代理中间件将请求路由到JavaTomcatWeb服务(代理目标)

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

我使用了许多不同的代理,包括http代理、http代理中间件、节点代理和express代理,但这些模块似乎都没有一个解决方案可用于后期参数操作

这个问题最初发布在

如有任何建议,我们将不胜感激

恭敬地


沃伦。

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

以下示例允许您在转发到代理目标之前插入POST参数。据我所知,代理目标响应中没有任何参数,因为它维护原始POST请求的副本

另一方面,这还允许http代理中间件使用主体解析器

示例节点快速路由文件:

'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;

是否有一种方法可以修改/添加
req.custom='value'
并将其传递给所有请求的代理。我在github中提出了一个问题,也只是在主体中添加了一个参数-即:body.custom=“value”,这将把它发布到代理。如果要使其适用于所有需要使用route.all的方法,请将route.all用于路由处理程序,然后修改代理筛选器以处理要接受的方法/谓词。基于此,您可以建议添加/修改代码
req.myvar='newval'
正文分析器提示“我的一天”!谢谢。
'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;