Node.js Connect.js中间件重写请求体
我有一个基于Express的Node.js应用程序。我希望在传入请求传递到连接中间件堆栈的其余部分之前转换该请求中的行尾字符(具体来说,将所有LF字符转换为CRLF字符)。是否存在用于重写请求正文的现有Connect.js中间件?理想情况下,我希望能够做到以下几点:Node.js Connect.js中间件重写请求体,node.js,express,connect,Node.js,Express,Connect,我有一个基于Express的Node.js应用程序。我希望在传入请求传递到连接中间件堆栈的其余部分之前转换该请求中的行尾字符(具体来说,将所有LF字符转换为CRLF字符)。是否存在用于重写请求正文的现有Connect.js中间件?理想情况下,我希望能够做到以下几点: var rewriter = bodyRewriter(function(bodyString){ return bodyString.replace(/\n/g, "\r\n"); }); app.use(rewriter)
var rewriter = bodyRewriter(function(bodyString){
return bodyString.replace(/\n/g, "\r\n");
});
app.use(rewriter);
我已经浏览了中间件,但找不到任何有效的东西。有connect modrewrite,但它似乎只适用于URL,而不适用于请求主体;有连接注入器,但它只适用于响应,而不适用于请求。我对Node.js非常陌生,我真的希望避免为这个看似简单的任务重新发明轮子。。。有什么我可以用的吗?这可能会奏效:
var rewriter = function(req, res, next) {
req.bodyString = '';
req.on('data', function(chunk) {
req.bodyString += chunk.replace(/\n/g, '\r\n');
});
next();
});
app.use(rewriter);
app.use(express.bodyParser());
在您的路线中,您将有可用的req.bodyString
但是,这对通过req.body
访问的任何项目都不起作用,因为bodyParser
不知道req.bodyString
的存在
由于bodyParser
希望直接读取请求的主体数据,因此您必须采用不同的路径并实现一个中间件,该中间件处理req.body
项以进行替换:
app.use(express.bodyParser());
app.use(function(req, res, next) {
for (var key in req.body) {
req.body[key] = req.body[key].replace(/\n/g, '\r\n');
}
next();
});
编辑:好的,在阅读您的评论和思考之后,这似乎适用于仅使用
LF
发布MIME消息的客户。不过,这是一个很大的黑客行为,因此肯定会有大问题
应使用以下代码而不是express.bodyParser()
:
不幸的是,你的两个解决方案都不起作用。也许我应该更清楚地解释我的情况。。。我有一个有缺陷的客户端(我无法控制),它在MIME消息中发送LF而不是CRLF。这会导致express.bodyParser在到达MIME边界时失败(根据MIME标准,该边界由LF而不是CRLF终止)。所以我需要在主体到达bodyParser之前执行替换。我最终确实找到了一个解决方案,我将把它作为一个答案发布,非常感谢你对它的评论。事实上,我发现的“解决方案”根本不起作用,所以我仍然非常感谢你在这方面的帮助…好吧,这将是一个棘手的问题,因为我不认为您可以以
bodyParser
能够识别的方式处理主体数据。让我再考虑一下…非常感谢你-它现在起作用了!(我不得不使用conncet.multipart而不是express.multipart)
app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart({ defer : true }));
app.use(function(req, res, next) {
req.form.on('error', function(err) {
console.error('form error', err);
next();
});
req.form.on('end', function() {
next();
});
var oldwrite = req.form.write.bind(req.form);
req.form.write = function(buffer) {
var string = buffer.toString();
// shortcut: if a message contains `\r\n`, assume it's okay.
if (string.indexOf('\r\n') === -1) {
string = string.replace(/\n/g, '\r\n');
}
return oldwrite(new Buffer(string));
};
});