Connect.js中间件重写请求体

我有一个基于Express的Node.js应用程序。 我希望在请求传递给我的连接中间件堆栈的其余部分(特别是将所有LF字符转换为CRLF字符)之前,将传入请求中的行结束字符转换。 是否有一个现有的Connect.js中间件来重写请求体? 理想情况下,我希望能够做到以下几点:

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项目的中间件来进行replace:

 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()

 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)); }; });