Tôi đang cố gắng thiết lập xử lý lỗi cho ứng dụng tốc hành của mình và gặp sự cố sau.Lỗi trung gian Express 3 không được gọi là
Tôi xác định một middleware lỗi và thêm nó như là trung gian cuối cùng:
// error handler
app.use(function(err, req, res, next) {
console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...');
next(err);
});
Bây giờ tôi mong chờ middleware này được gọi là bất cứ khi nào một lỗi xảy ra:
app.get('/datenschutz', function(req, res, next){
return next(new Error('Just testing')); // handle everything here
});
Tuy nhiên middleware của tôi là không bao giờ gọi là! Tuy nhiên, trình duyệt hiển thị dấu vết ngăn xếp. Điều này có vẻ như có một phần mềm trung gian khác đang bắt lỗi này và xử lý nó trước khi tôi có thể làm bất cứ điều gì về nó.
Vấn đề là tôi không có đầu mối nơi trung gian này có thể được định nghĩa, như tôi có một thiết lập rất đơn giản:
// setup ssl for local testing
var
app = express();
app.
use(express.static(__dirname + '/public')).
use(express.bodyParser()).
use(express.cookieParser());
Tại sao là xử lý lỗi của tôi middleware không được gọi là? Xử lý lỗi 'mặc định' này diễn ra ở đâu?
Cảm ơn!
* CHỈNH SỬA * Tôi thấy rằng phần mềm trung gian thực sự hoạt động. Tuy nhiên, đây là trường hợp nếu tôi gọi nó từ một hàm trung gian khác. Tuy nhiên, nó không được gọi nếu lỗi xảy ra bên trong một hàm được định nghĩa là một tuyến đường cao tốc (GET, POST, vv ..). Điều này rất lạ. Nếu tôi thêm middleware lỗi của tôi vào callbacks tuyến đường sau đó nó hoạt động:
app.get('/testError', function(req, res, next){
return next(new Error('Just testing')); // handle everything here
}, function(err,req,res,next) {
console.log('This error handler is called!!');
return next();
});
* EDIT 2 - FOUND CÁCH GIẢI QUYẾT CHẤP NHẬN ** Tôi ngạc nhiên nó phải được thực hiện theo cách này. Như tôi đã đọc nhiều bài viết/câu hỏi về xử lý lỗi trong thể hiện và không bao giờ tìm thấy khả năng này được đề cập. Tuy nhiên có vẻ như nếu một lỗi ocurrs bên trong một cuộc gọi lại đường trung gian, trình xử lý trung gian lỗi thường xuyên sẽ không nhặt nó lên. Bạn sẽ cần xác định trình xử lý lỗi ở cấp tuyến.
app.all('*', function(err,req,res,next) {
console.log('This is a global error handler at route level....');
return next(err);
});
Bạn có 'app.use (app.router)' trước khi trình xử lý lỗi được đặt trên 'ứng dụng' không? – staackuser2
@emostar - không. Tất cả phần mềm trung gian được liệt kê ở trên. – santiagoIT
Được rồi, sau đó thêm 'app.use (app.router)' trước trình xử lý lỗi;) – staackuser2