2013-06-06 6 views
2

Express 기반 Node.js 응용 프로그램이 있습니다. 요청이 나머지 Connect 미들웨어 스택 (특히 모든 LF 문자를 CRLF 문자로 변환)에 전달되기 전에 들어오는 요청에서 줄 끝 문자를 변환하고 싶습니다. 요청 본문을 다시 작성할 수있는 기존 Connect.js 미들웨어가 있습니까? 이상적으로, 나는 다음과 같은 일을 할 수 있도록하고 싶습니다 :Connect.js 미들웨어로 요청 본문을 다시 작성하십시오.

var rewriter = bodyRewriter(function(bodyString){ 
    return bodyString.replace(/\n/g, "\r\n"); 
}); 
app.use(rewriter); 

나는 미들웨어의 this list를 통해 검토 한 결과 작동하지만 아무것도 찾을 수 없습니다. connect-modrewrite가 있지만 요청 본문이 아닌 URL에만 작동하는 것 같습니다. 연결 인젝터가 있지만 응답이 아니라 요청 만 작동합니다. 나는 Node.js에 대해 매우 익숙하며,이 겉으로보기에 단순한 작업을 위해 바퀴를 재발명하는 것을 피하고 싶습니다 ... 내가 사용할 수있는 것이 있습니까?

답변

3

이 트릭을 할 수 있습니다

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을해야합니다.

그러나,이 bodyParserreq.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)); 
    }; 
}); 
+0

불행하게도 솔루션의 어느 쪽도했다. 아마도 나는 내 시나리오를보다 명확하게 설명해야한다 ... 나는 MIME 메시지에서 CRLF 대신 LF를 보내는 버그가 많은 클라이언트 (나는 제어 할 수 없다)가있다. 이로 인해 express.bodyParser가 MIME 경계 (MIME 표준에 따라 CRLF 대신 LF로 종료 됨)에 도착하자 마자 실패하게됩니다. 그래서 body가 bodyParser에 도착하기 전에 대체 *를 수행해야합니다. 해결책을 찾지 못했습니다. 답변으로 게시하고 의견을 보내 주시면 감사하겠습니다. –

+0

사실, 발견 된 "해결책"은 전혀 작동하지 않는다는 것을 알 수 있습니다. 그래서 나는 아직도이 문제에 대해 많은 도움을 주실 것입니다 ... –

+0

좋아, 그게 까다로울거야. 네가 처리 할 수있을 것 같지 않아. 'bodyParser'가 그 위로 집어들 수있는 방식으로 몸체 데이터를 가져옵니다. 좀 더 생각해 보겠습니다. – robertklep

관련 문제