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