2012-08-08 7 views
22

나는 절대 NodeJS 초보자이며 익스프레스와 몽구스로 간단한 REST-Webservice를 만들고 싶다.몽구스로 오류 처리

한 곳에서 몽구스의 오류를 처리하는 가장 좋은 방법은 무엇입니까?

어디서나 데이터베이스 오류가 나는 오류 메시지와 HTTP를-500 오류 페이지를 반환 할 발생합니다

if(error) { 
    res.writeHead(500, {'Content-Type': 'application/json'}); 
    res.write('{error: "' + error + '"}'); 
    res.end(); 
} 

내가 전역 오류 리스너에 대한 읽기 이전 튜토리얼 http://blog-next-stage.learnboost.com/mongoose/에서 :

Mongoose.addListener('error',function(errObj,scope_of_error)); 

하지만이게 작동하지 않는 것 같아서이 청취자에 대해 official Mongoose documentation에서 뭔가를 찾을 수 없습니다. 모든 Mongo 요청 후에 오류를 확인 했습니까?

답변

40

Express를 사용하는 경우 오류는 일반적으로 경로에서 직접 처리되거나 몽구스 상단에있는 API 내에서 처리되어 next에 따라 오류가 전달됩니다.

app.get('/tickets', function (req, res, next) { 
    PlaneTickets.find({}, function (err, tickets) { 
    if (err) return next(err); 
    // or if no tickets are found maybe 
    if (0 === tickets.length) return next(new NotFoundError)); 
    ... 
    }) 
}) 

NotFoundError

맞춤형 메시징을 제공하기 위해 error handler middleware에 콧방귀를 뀌 수 있습니다.

일부 추상화는 가능하지만 오류를 경로 체인에 전달하려면 여전히 next 메소드에 액세스해야합니다.

PlaneTickets.search(term, next, function (tickets) { 
    // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node 
}) 

몽구스 오류를 중앙에서 처리하는 경우에는 em을 처리 할 장소가 하나도 없습니다. 오류가 여러 수준에서 처리 할 수 ​​있습니다 :

connection 오류는 connection 당신의 모델에 방출되는 전형적인 쿼리/업데이트 이처럼

mongoose.connect(..); 
mongoose.connection.on('error', handler); 

// or if using separate connections 
var conn = mongoose.createConnection(..); 
conn.on('error', handler); 

, 사용/오류가 콜백에 전달됩니다 제거합니다. 당신이 콜백을 전달하지 않으면

PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request! 
ticket.save(); // no callback passed 

을하고 듣고되지 않습니다 오류가 모델 에 방출되는 콜백을 전달하지 않으면

PlaneTickets.find({..}, function (err, tickets) { 
    if (err) ... 

경우 당신은 그것을 듣고 model 레벨의 오류는 connection 모델에서 방출됩니다.

여기서 중요한 문제는 next에 대한 액세스가 필요하므로 오류를 전달하는 것입니다.

+0

감사합니다. 도움이 될 답변은 나를 위해 오류 처리에 대해 많이 설명합니다. – Sonson123

+0

좋은 답변입니다! next()를 사용하여 ExpressJS의 오류 처리 미들웨어에 직접 연결하는 방법에 대한 제안. –

+0

그건 mongoose.connection.on ('error', handler)와 작동하지 않습니다; 또는 conn.on ('오류', 처리기); 나를 위해, 나는 handle.log() 함수가 핸들러를 첫 번째 인수이지만 서버 콘솔에는 아무 것도 나타나지 않는다고 정의했다. – Vadorequest