이 트릭을 할 수 있습니다
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
을해야합니다.
그러나,이 bodyParser
이 req.bodyString
의 존재를 인식하지 못하기 때문에, 당신은 req.body
를 통해 액세스하는 모든 항목에 대해 작동하지 않을.
그리고 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()
의를 사용해야합니다
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));
};
});
불행하게도 솔루션의 어느 쪽도했다. 아마도 나는 내 시나리오를보다 명확하게 설명해야한다 ... 나는 MIME 메시지에서 CRLF 대신 LF를 보내는 버그가 많은 클라이언트 (나는 제어 할 수 없다)가있다. 이로 인해 express.bodyParser가 MIME 경계 (MIME 표준에 따라 CRLF 대신 LF로 종료 됨)에 도착하자 마자 실패하게됩니다. 그래서 body가 bodyParser에 도착하기 전에 대체 *를 수행해야합니다. 해결책을 찾지 못했습니다. 답변으로 게시하고 의견을 보내 주시면 감사하겠습니다. –
사실, 발견 된 "해결책"은 전혀 작동하지 않는다는 것을 알 수 있습니다. 그래서 나는 아직도이 문제에 대해 많은 도움을 주실 것입니다 ... –
좋아, 그게 까다로울거야. 네가 처리 할 수있을 것 같지 않아. 'bodyParser'가 그 위로 집어들 수있는 방식으로 몸체 데이터를 가져옵니다. 좀 더 생각해 보겠습니다. – robertklep