[英]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-parser和multer等正文分析中间件时填充。
因此,使用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.