2012-02-10 27 views
12

Tôi đang làm việc với đối tác trong một dự án. Anh ta đã viết rất nhiều mã trong Node.js + Express, nhưng chúng tôi đã gặp phải các vấn đề với kiến ​​trúc.Cách xử lý lỗi trong Node.js bằng cách sử dụng Express

Để khắc phục điều này, vai trò chính của tôi là tìm ra cách tốt nhất để kiến ​​trúc một ứng dụng Node.js + Express. Tôi đã chạy vào hai kịch bản, xử lý các lỗi và tôi muốn một số gợi ý.

Trước tiên, làm cách nào để nắm bắt các ngoại lệ cấp cao nhất? Điều cuối cùng tôi muốn là cho một lỗi để hoàn toàn giết chết quá trình nút. Tôi muốn tiếp tục phục vụ người dùng khi gặp phải bất kỳ lỗi nào.

Thứ hai, một số lỗi được trả lại qua cuộc gọi lại (chúng tôi đang sử dụng). Là một phần của mỗi trình xử lý tuyến đường, hoặc là chúng tôi hiển thị chế độ xem (GET), chuyển hướng đến một tuyến đường khác (POST) và chúng tôi muốn chuyển hướng đến màn hình lỗi có thông báo lỗi tùy chỉnh. Làm thế nào tôi có thể chắc chắn nắm bắt được logic này ở một nơi?

+0

Có thể làm điều đó với tên miền, vui lòng kiểm tra câu trả lời này: [Xử lý lỗi hoặc miền nhanh? - Câu trả lời] [1] [1]: http://stackoverflow.com/a/27382031/923642 – JakubKnejzlik

Trả lời

13

Trước tiên, làm cách nào để nắm bắt ngoại lệ cấp cao nhất? Điều cuối cùng tôi muốn là cho một lỗi để hoàn toàn giết chết quá trình nút. Tôi muốn tiếp tục phục vụ người dùng khi gặp phải bất kỳ lỗi nào.

Edit: Tôi nghĩ triết lý nút nói chung là bất kỳ trường hợp ngoại lệ uncaught nên giết chết quá trình, và rằng bạn nên chạy ứng dụng nút của bạn dưới một số loại màn hình quá trình với các cơ sở khai thác gỗ thích hợp. Lời khuyên sau đây liên quan đến bất kỳ lỗi nào khác mà bạn có thể gặp phải trong trình xử lý tuyến đường nhanh của mình, v.v.

Express có lỗi chungHandler, cần nắm bắt tất cả lỗi được gửi cũng như mọi thứ được chuyển thành tham số next trong tuyến đường/phần giữa của bạn, và trả lời với 500 Internal Server Error.

Thứ hai, một số lỗi được trả lại qua cuộc gọi lại (chúng tôi đang sử dụng caolan/async).Là một phần của mỗi trình xử lý tuyến đường, hoặc là chúng tôi hiển thị chế độ xem (GET), chuyển hướng đến một tuyến đường khác (POST) và chúng tôi muốn chuyển hướng đến màn hình lỗi có thông báo lỗi tùy chỉnh. Làm thế nào tôi có thể chắc chắn để nắm bắt logic này ở một nơi?

Bạn có thể tạo một phong tục handleError, mà bạn gọi trong mỗi callback như vậy:

async.series(..., function(err, results) { 
    if(err) 
    return handleError(req, res, err); 
    // ... 
}); 

Hoặc bạn chỉ có thể vượt qua các lỗi trên với next(err) và thực hiện xử lý lỗi tùy chỉnh của bạn như được mô tả ở đây: http://expressjs.com/guide/error-handling.html

+2

Express errorHandler- KHÔNG bắt lỗi đó xảy ra bên ngoài của tuyến đường bộ xử lý/middleware. Vì vậy, nếu một lỗi xảy ra bên ngoài trình xử lý 'app.use()' hoặc 'app.get | post | put | delete()', bạn không thể dựa vào lỗi express/connect errorHandler để nắm bắt nó. – timkg

4

Top ngoại lệ mức:

Bạn có thể sử dụng uncaughtException event from process, nhưng nó thường không được khuyến khích.

Thường thì các ứng dụng sẽ chuyển sang trạng thái bị hỏng (ví dụ: bạn có một số trạng thái thường được đặt, nhưng ngoại lệ khiến không xảy ra) khi ngoại lệ được ném. Sau đó, nó sẽ chỉ gây ra nhiều hơn và nhiều hơn nữa các lỗi từ đó trở đi.

Cách tiếp cận được khuyến nghị là sử dụng một cái gì đó như forever để tự động khởi động lại ứng dụng trong trường hợp nó gặp sự cố. Bằng cách này, bạn sẽ có ứng dụng ở trạng thái sane ngay cả sau một vụ tai nạn. xử lý kịp nhanh

Lỗi:

Bạn có thể tạo một trường hợp Lỗi mới và vượt qua nó để gọi lại tiếp theo trong chuỗi.

Ví dụ:

express.get('/some/url', function(req, res, next) { 
    //something here 
    if(error) { 
     next(new Error('blah blah')); 
    } 
}); 

Để xử lý lỗi từ đây trở đi, bạn có thể đặt trình xử lý lỗi. Xem express docs on error handling

3

Thanh toán mô-đun xử lý nhật ký tuyệt vời Winston: https://github.com/flatiron/winston

Nó cho phép bạn định cấu hình xử lý ngoại lệ theo cách sẽ không chỉ ghi nhật ký, mà còn cho phép quá trình tiếp tục. Và, vì đây rõ ràng sẽ là vấn đề nghiêm trọng, bạn thậm chí có thể cấu hình Winston để gửi email về các loại sự kiện cụ thể (như trường hợp ngoại lệ).

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