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.
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
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. –
Đ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