2012-11-02 23 views
19

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); 
    }); 
+3

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

+0

@emostar - không. Tất cả phần mềm trung gian được liệt kê ở trên. – santiagoIT

+9

Được rồi, sau đó thêm 'app.use (app.router)' trước trình xử lý lỗi;) – staackuser2

Trả lời

1

EDIT 2 (sabtioagoIT) hoạt động. Nhưng chỉ dành cho những người bỏ lỡ nó, giải pháp của emostar cũng hoạt động. Tôi đã hiểu cách di chuyển lỗi xử lý cuộc gọi 'sử dụng' đến cuối, nhưng dường như có một tùy chọn dễ dàng hơn như giả thiết đề xuất, sử dụng app.router (trước khi xử lý lỗi 'sử dụng' cuộc gọi).

3

Tôi cũng gặp vấn đề này, nhưng tôi không thể hiểu tại sao nó không hoạt động mặc dù tôi đã đặt trình xử lý lỗi của mình sau app.user(app.router). Khi nó quay ra, tôi đã có một trình xử lý lỗi mà tôi không biết.

Cụ thể, nếu bạn sử dụng cli nhanh để tạo ra một ứng dụng như tôi đã làm, nó sẽ tự động thêm vào này trong:

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

Thật không may cho tôi, tôi đã thêm middleware hơn một chút để ứng dụng của tôi, mà do đó che khuất tuyên bố này và do đó ngăn cản xử lý lỗi tùy chỉnh của tôi khỏi bị gọi.

Chỉ cần xóa điều đó và sau đó nó sẽ hoạt động bình thường.

Lưu ý phụ, tôi nên đề cập đến giải pháp ban đầu vẫn hoạt động - ngay cả với app.use(express.errorHandler()).

app.all('*', function(err,req,res,next) { 
    console.log('This is a global error handler at route level....'); 
    return next(err); 
}); 
1

Câu trả lời cập nhật cho người dùng Express 4 from the Express 4 docs. Xem ví dụ từ tài liệu bên dưới. Lưu ý rằng app.router không được dùng nữa và không còn được sử dụng nữa. Tôi cũng đã thêm một tuyến đường giả để làm cho trật tự rõ ràng:

"Bạn định nghĩa middleware lỗi xử lý cuối cùng, sau khi app.use khác() và các tuyến đường gọi; Ví dụ:

var bodyParser = require('body-parser'); 

app.use(bodyParser()); 
app.get('/', function(req, res) { 
    res.send('hello world'); 
}) 
app.use(function(err, req, res, next) { 
    // logic 
}); 

"

Các vấn đề liên quan