簡體   English   中英

使用Node.js代理POST並修改標頭

[英]Proxying POST with Node.js and modifying headers

我的本地開發腳本使用代理來解決CORS(以及其他問題)。 首先,我得到了一些錯誤的cookie,這使我可以在開發時跳過應用程序中的身份驗證。 然后,對spoofCookies的回調設置了我的靜態代理-傳遞了我所有的本地靜態內容,然后為路由到/ microsvc的所有調用設置了代理。 我接了那個電話,注入了我的欺騙性cookie,然后將其轉發到遠程主機上的相同路徑。

該腳本非常適合GET,但是我對如何編寫POST部分一無所知。 該請求從不顯示我已通過代理發送的POST表單,因此我必須做錯了什么。

謝謝你的時間

    /*jslint node:true white:true nomen:true es5:true*/

'use strict';

var PORT_HTTP = process.env.PORT || 4400;
var localAddress =  "http://localhost:" + PORT_HTTP;

var apiAddress = {      label:      "On-site Ethernet Plug",
                        protocol:   "http://",
                        port:       80,
                        host :      "10.17.100.11",
                        microsvc:   "/microsvc",
                        auth:       "/login.form"
                 };

var https = require('https');
var path = require('path');
var express = require('express');
var app = express();
var spoofCookie = require('./utils/spoof-cookies');
var cookies = [];

var proxy = function(myPath, searchOptions, req, res, cookies) {
    var options = {
        hostname: apiAddress.host,
        port: apiAddress.port,
        path: apiAddress.microsvc + searchOptions,
        rejectUnauthorized: false
    };

    if(cookies.length){
        options.headers = {
            "Cookie":cookies[0]
        };
    }

    try {
        console.log('FROM: ' + localAddress + myPath + searchOptions + '\n' +
                    '↳ TO: ' + apiAddress.protocol + apiAddress.host + apiAddress.microsvc + searchOptions);

        options.method = req.method;

        if(options.method == 'POST' || options.method == 'PUT') {

            // HELP
            // form data never appears in output
            console.log(req);

        } else {
            var r = https.request(options, function(resX) {
                resX.setEncoding('utf8');
                var responseData = '';
                resX.on('data', function(chunk) {
                    responseData += chunk;
                });
                resX.on('end', function() {
                    res.send(JSON.parse(responseData));
                });
            });

            r.on('error', function(e) {
                if (e.code == "ENOTFOUND") {
                    console.error("File not found on remote");
                } else {
                    console.error('ff ' + e);
                }
            });
        }

        req.pipe(r).pipe(res);

    } catch (e) {
        console.error(e);
    }
};

// START - first get spoofed cookies
spoofCookie.getCookies(apiAddress, function(cookies) { 

    // set up server
    var httpServer = http.createServer(app);
    httpServer.listen(PORT_HTTP);

    // microservice proxy
    app.use('/microsvc', function (req, res) {
        proxy('/microsvc', req.url, req, res, cookies);
    });

    console.log("HTTP server started: " + localAddress);

});


// static server runs anything that isn't set up for proxy
app.use(express.static(path.resolve(path.join(__dirname, "..", "app"))));

Express默認情況下不解析請求正文。

req.body包含在請求正文中提交的鍵-值數據對。 默認情況下,它是undefined ,並且在使用body-parsermulter正文分析中間件時填充。

因此,使用body-parser的設置應如下所示。

首先,在聲明路由之前,將中間件連接到某處:

var bodyParser = require('body-parser');

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));

// parse application/json
app.use(bodyParser.json());

// microservice proxy
app.use('/microsvc', function (req, res) {
    proxy('/microsvc', req.url, req, res, cookies);
});

然后,訪問request.body請求內容:

if(options.method == 'POST' || options.method == 'PUT') {
    console.log(req.body);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM