节点 express/request:通过正文解析传递 POST 请求
node express/request: piping a POST request with body parsing
我正在尝试按照以下几行通过管道传输请求以供远程服务器处理:
var destination = request(url);
req.pipe(destination).pipe(res);
这适用于 GET
请求。但是对于 POST
个请求,我很吃力。我认为,需要注意的重要一点是,对于 POST
请求,我在 POST
路由处理程序之前使用主体解析器,以便从 POST
请求中提取主体。 .它只是一个基本的文本正文解析器,因为正文包含纯文本:
var postRouteHandler = someFunction;
var bodyParser = require('body-parser');
var textParser = bodyParser.text({
limit: '50kb'
});
app.use('/postRoute', [textParser, postRouteHandler]);
从 this issue and this issue 看来,在我看来,在通过管道传输之前对 POST
请求进行任何处理都会导致问题。事实上,当我删除解析器时,管道似乎工作正常。
问题是我需要先检查正文,进行一些初始处理,然后再确定是否将请求通过管道传送到远程服务器。所以我需要在管道之前解析正文。
有什么办法解决这个问题吗?
如果问题是由解析器引起的,您应该创建自己的中间件。老实说,您可能希望以不同于正文解析器的方式解析正文。
鉴于您对项目的其余部分正在做什么的了解有限,您可以创建中间件来挂钩主体解析器中间件并发送请求的克隆。然而,这不是很有效,但会起作用,并且可能会帮助您指明正确的方向。
var postRouteHandler = someFunction;
var bodyParser = require('body-parser');
var textParseMiddleware = function (req, res, next) {
var requestclone = _.clone(req);
var textParser = bodyParser.text({
limit: '50kb'
});
textParser(requestclone, res, function(){
console.log('examine the body here', requestclone.body);
});
}
app.use('/postRoute', [textParserMiddleWare, postRouteHandler]);
我没有测试过上面的代码。
问题是对于流(如 req
),一旦您阅读它就无法重置它。
因为 body-parser
已经读取了流,管道将不起作用,因为这将尝试再次读取流(此时已经用完)。
解决方法是获取 body-parser
读取的文本,并创建一个最小的 req
"clone" 以便 request
能够传递请求:
var intoStream = require('into-stream');
var bodyParser = require('body-parser');
var textParser = bodyParser.text({ limit: '50kb' });
var postRouteHandler = function(req, res) {
let text = req.body;
if (! shouldPipe(text)) {
return res.sendStatus(400); // or whatever
}
// Here's where the magic happens: create a new stream from `text`,
// and copy the properties from `req` that `request` needs to pass
// along the request to the destination.
let stream = intoStream(text);
stream.method = req.method;
stream.headers = req.headers;
// Pipe the newly created stream to request.
stream.pipe(request(url)).pipe(res);
};
app.use('/postRoute', [textParser, postRouteHandler]);
需要通过 POST 发送大量数据,我收到错误:套接字挂起/代码:'ECONNRESET'。
能够通过增加正文解析器的限制来解决它。
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json({limit:'50mb'}));
我正在尝试按照以下几行通过管道传输请求以供远程服务器处理:
var destination = request(url);
req.pipe(destination).pipe(res);
这适用于 GET
请求。但是对于 POST
个请求,我很吃力。我认为,需要注意的重要一点是,对于 POST
请求,我在 POST
路由处理程序之前使用主体解析器,以便从 POST
请求中提取主体。 .它只是一个基本的文本正文解析器,因为正文包含纯文本:
var postRouteHandler = someFunction;
var bodyParser = require('body-parser');
var textParser = bodyParser.text({
limit: '50kb'
});
app.use('/postRoute', [textParser, postRouteHandler]);
从 this issue and this issue 看来,在我看来,在通过管道传输之前对 POST
请求进行任何处理都会导致问题。事实上,当我删除解析器时,管道似乎工作正常。
问题是我需要先检查正文,进行一些初始处理,然后再确定是否将请求通过管道传送到远程服务器。所以我需要在管道之前解析正文。
有什么办法解决这个问题吗?
如果问题是由解析器引起的,您应该创建自己的中间件。老实说,您可能希望以不同于正文解析器的方式解析正文。
鉴于您对项目的其余部分正在做什么的了解有限,您可以创建中间件来挂钩主体解析器中间件并发送请求的克隆。然而,这不是很有效,但会起作用,并且可能会帮助您指明正确的方向。
var postRouteHandler = someFunction;
var bodyParser = require('body-parser');
var textParseMiddleware = function (req, res, next) {
var requestclone = _.clone(req);
var textParser = bodyParser.text({
limit: '50kb'
});
textParser(requestclone, res, function(){
console.log('examine the body here', requestclone.body);
});
}
app.use('/postRoute', [textParserMiddleWare, postRouteHandler]);
我没有测试过上面的代码。
问题是对于流(如 req
),一旦您阅读它就无法重置它。
因为 body-parser
已经读取了流,管道将不起作用,因为这将尝试再次读取流(此时已经用完)。
解决方法是获取 body-parser
读取的文本,并创建一个最小的 req
"clone" 以便 request
能够传递请求:
var intoStream = require('into-stream');
var bodyParser = require('body-parser');
var textParser = bodyParser.text({ limit: '50kb' });
var postRouteHandler = function(req, res) {
let text = req.body;
if (! shouldPipe(text)) {
return res.sendStatus(400); // or whatever
}
// Here's where the magic happens: create a new stream from `text`,
// and copy the properties from `req` that `request` needs to pass
// along the request to the destination.
let stream = intoStream(text);
stream.method = req.method;
stream.headers = req.headers;
// Pipe the newly created stream to request.
stream.pipe(request(url)).pipe(res);
};
app.use('/postRoute', [textParser, postRouteHandler]);
需要通过 POST 发送大量数据,我收到错误:套接字挂起/代码:'ECONNRESET'。 能够通过增加正文解析器的限制来解决它。
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json({limit:'50mb'}));