drm*_*wer 5 javascript node.js express node-request
我正在尝试通过以下方式管理远程服务器处理请求:
var destination = request(url);
req.pipe(destination).pipe(res);
Run Code Online (Sandbox Code Playgroud)
这适用于GET请求.但对于POST要求,我正在努力.我认为需要注意的一点是,对于POST请求,我在POST路由处理程序之前使用了一个正文解析器,以便从POST请求中提取正文...它只是一个基本的文本正文解析器,因为正文包含纯文本:
var postRouteHandler = someFunction;
var bodyParser = require('body-parser');
var textParser = bodyParser.text({
limit: '50kb'
});
app.use('/postRoute', [textParser, postRouteHandler]);
Run Code Online (Sandbox Code Playgroud)
从这个问题和这个问题来看,我觉得在POST管道之前对请求进行任何处理都会导致问题.实际上,当我删除解析器时,管道似乎工作正常.
问题是我需要首先检查主体,进行一些初始处理,然后确定是否将请求通过管道传输到远程服务器上.所以我需要在管道之前解析身体.
有没有解决这个问题的方法?
rob*_*lep 10
问题是,使用流(如req),一旦你阅读它,你就无法重置它.
因为body-parser已经读取了流,所以管道它将无法工作,因为它将尝试再次读取流(在那时已经耗尽).
解决方法是将文本读取body-parser,并创建一个最小的req"克隆",以便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]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5553 次 |
| 最近记录: |