2016-07-29 1 views
1

내 서버에서 제공하는 4XX 및 5XX 오류의 양을 저장하고 싶습니다. 내가 갔던 방법은 상태 코드 응답에게 나는 위의 코드를 사용하고Expressjs 앱의 클라이언트에게 보낸 응답 코드에 액세스하는 방법

const fooMiddleware = (req, res, next) => { 
    req.stats.totalRequestsServed += 1; 

    // I want to access the status code sent to the client here 
    console.log('status code', res.statusCode); 
    next(null); 
}; 

을 얻기 위해 명시 미들웨어를 만드는 것이었다 그러나 나는 항상 내가 내 길에 res.status(401).end()를 하드 경우에도 200 상태 코드를 얻고있다 .

답변

1

의 답이 here

app.use(function (req, res, next) { 
    function afterResponse() { 
     res.removeListener('finish', afterResponse); 
     res.removeListener('close', afterResponse); 

     // do smth after res.send 
     console.log(res.status); 
    } 

    res.on('finish', afterResponse); 
    res.on('close', afterResponse); 

    // do smth before request eventually calling `next()` 
    next(); 
}); 

이럴 찾을 수 있습니다, 후크 투명성 없습니다. "특별한"사례가 필요합니다.
오류 처리기는 4xx 및 5xx 오류를 기록하는 데 더 좋습니다.

app.get('/smth', function(req, res, next){ 
    if (!smth-check) 
     return next(new HttpError(401, 'Error-text')); // it's custom error class 
    ... 
}) 

app.use(function(err, req, res, next)) { 
    if (err instance of HttpError) 
     console.log(err.status); 
    ... 
}); 

는 약 custom error HttpError로 당신은 내가 패키지가이 리스너를 추가 관리 on-finished라고 볼 here

+0

두 번째 방법의 문제점은 우리가 항상 다음을 사용하지 않는다는 것입니다. 그리고 저는 더 독립형 솔루션을 선호합니다. –

0

읽을 수 있습니다. 그것은이 같은 사용 될 수 :

const onFinished = require('on-finished'); 

const middleware = (req, res, next) => { 

    onFinished(res, (err, res) => { 
    // do smth after res.send 
    }); 

    // do smth before request eventually calling `next()` 
    next(null); 
}; 
0

당신의 논리는, 당신은 단지 상태를 받고 전에 next를 호출 할 필요가 옳았다 그래서 다른 미들웨어/상태 코드를 설정할 수 있습니다 경로 :

const fooMiddleware = (req, res, next) => { 
    req.stats.totalRequestsServed += 1; 
    next(); 
    console.log('status code', res.statusCode); 
}; 
관련 문제