2012-08-08 38 views
22

Tôi là người mới bắt đầu NodeJS tuyệt đối và muốn tạo một REST-Webservice đơn giản với Express và Mongoose.Xử lý lỗi với Mongoose

Thực tiễn tốt nhất để xử lý lỗi của Mongoose ở một vị trí trung tâm là gì?

Khi bất cứ nơi nào một lỗi cơ sở dữ liệu xảy ra tôi muốn quay trở lại một Http-500-Lỗi-Trang với một thông báo lỗi:

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

Trong hướng dẫn cũ http://blog-next-stage.learnboost.com/mongoose/ Tôi đọc về một người biết lắng nghe lỗi toàn cầu:

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

Nhưng điều này dường như không hoạt động và tôi không thể tìm thấy nội dung nào đó trong số official Mongoose documentation về người nghe này. Tôi có kiểm tra lỗi sau mỗi yêu cầu Mongo không?

Trả lời

40

Nếu bạn đang sử dụng Express, lỗi thường được xử lý trực tiếp trong tuyến đường của bạn hoặc trong api được xây dựng trên đầu trang của mongoose, chuyển tiếp lỗi đến 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)); 
    ... 
    }) 
}) 

Các NotFoundError thể ngửi trong error handler middleware bạn để cung cấp tin nhắn cá nhân hoá.

Một số trừu tượng là có thể nhưng bạn vẫn sẽ yêu cầu quyền truy cập vào phương pháp next để chuyển lỗi xuống chuỗi tuyến đường.

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

Đối với lỗi xử lý trung tâm mongoose, không thực sự là một nơi để xử lý tất cả. Lỗi có thể bị xử lý ở mức độ khác nhau:

connection lỗi được phát ra trên connection mô hình của bạn đang sử dụng, vì vậy

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

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

Đối với các truy vấn điển hình/cập nhật/gỡ bỏ các lỗi được truyền cho gọi lại của bạn.

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

Nếu bạn không vượt qua một callback lỗi được phát ra trên Model nếu bạn đang lắng nghe cho nó:

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

Nếu bạn không vượt qua một callback và không nghe lỗi ở mức model chúng sẽ được phát ra trên các mẫu connection.

Việc lấy chìa khóa ở đây là bạn muốn truy cập vào next bằng cách nào đó để truyền lỗi.

+0

Cảm ơn, câu trả lời hữu ích của bạn làm rõ rất nhiều về việc xử lý lỗi cho tôi. – Sonson123

+0

Câu trả lời hay! Đặc biệt là gợi ý về việc sử dụng next() để liên kết trực tiếp vào phần mềm trung gian xử lý lỗi của ExpressJS. –

+0

Điều đó không có tác dụng với mongoose.connection.on ('error', handler); hoặc conn.on ('lỗi', xử lý); đối với tôi, tôi đã định nghĩa handler như một hàm mà console.log() là arg đầu tiên nhưng không có gì xuất hiện trên giao diện điều khiển máy chủ. – Vadorequest