Tôi đang gặp khó khăn khi hiểu cách xử lý nội dung nào đó có vẻ như là một khía cạnh khá cơ bản về diễn đạt. Nếu tôi có một số mã ném một ngoại lệ trong một cuộc gọi lại không đồng bộ, không có cách nào tôi có thể bắt ngoại lệ đó bởi vì khối try/catch không còn trong phạm vi thời gian gọi lại đang chạy. Trong những tình huống này, trình duyệt sẽ treo cho đến khi cuối cùng bỏ cuộc nói rằng máy chủ không hồi đáp. Đây là trải nghiệm người dùng rất xấu. Tôi sẽ có thể trả lại ngay một lỗi 500 cho khách hàng. Trình xử lý lỗi nhanh mặc định dường như không xử lý tình huống này. Dưới đây là một số mã mẫu:Xử lý ngoại lệ theo cách rõ ràng
var express = require("express");
var app = express();
app.use(app.router);
//express error handler (never called)
app.use(function(err, req, res, next) {
console.log(err);
res.send(500);
});
app.get("/test", function(req, res, next) {
require("fs").readFile("/some/file", function(err, data) {
a.b(); //blow up
});
});
app.listen(8888);
Trong đoạn mã trên, dòng a.b() ném một ngoại lệ "Tham chiếuError: a chưa được xác định". Trình xử lý lỗi được định nghĩa không bao giờ được gọi. Lưu ý rằng đối tượng err được trả về bởi fs.readFile() là null trong trường hợp này vì tệp đã được đọc chính xác. Lỗi là mã bên trong trình xử lý async.
Tôi đã đọc this post về việc sử dụng uncaughtExpception của nút ngay cả, nhưng the documentation nói không sử dụng phương pháp đó. Ngay cả khi tôi đã sử dụng nó, làm thế nào sau đó tôi sẽ gửi trả lời 500 cho người dùng? Các đối tượng phản ứng nhanh không còn xung quanh để tôi sử dụng.
Vậy bạn xử lý tình huống này như thế nào?
Tại sao lỗi được đưa ra trong cuộc gọi lại? Nhiều khả năng, MongooseObject sẽ ném một lỗi nội bộ, nơi bạn sẽ bắt nó, và sau đó 'callback (err)'. Bây giờ gọi lại được hiển thị ở trên có một đối tượng lỗi giả và bạn có thể gửi trả lời 500. – Plato
Nếu Mongoose được vào tình huống mà nó KHÔNG gọi lại với một lỗi ... hmm Tôi dunno có lẽ bạn có thể làm cho một wrapper setTimeout. nhưng tôi hy vọng tất cả các lỗi sẽ được chuyển ngay đến hàm gọi lại – Plato
Nó không phải là Mongoose Tôi lo lắng, tôi chỉ sử dụng nó như một cách để gọi một hàm async. Tôi lo lắng nhiều hơn về mã của riêng tôi đang làm một cái gì đó câm và gây ra một ngoại lệ để được ném. Tôi sẽ cập nhật mã mẫu để làm rõ hơn. – d512