Async await Error Handling in Express

Nội dung bài viết

Video học lập trình mỗi ngày

Mấy hôm trở lại đây, chúng ta đã thảo luận khá nhiều về PromiseAsync/await. Đây là một đề tài khá thú vị, vì có nhiều cách triển khai gây tranh cãi về performance khi sử dụng cái này cái kia. Nhưng trong bài học này chúng ta tập trung vào việc xử lý lỗi ở Expressjs

Yêu cầu người đọc: 

  • Hiểu Express là gì? 
  • Hiểu viết RESTful API là gì? 

Nếu chưa hiểu gì hết thì có lẽ bạn nên đọc thêm những khái niệm trên hoặc bạn có thể lướt nhanh tóm tắt ở phía dưới. Trước sau gì bạn đi theo con đường Lập Trình Viên thì bạn cũng sẽ gặp thôi. 

Sơ qua khái nhiệm cho mấy ông ham học mà chưa học tới =]]. 

Hiểu Express là gì?

Express là một framework giành cho nodejs. Nó cung cấp cho chúng ta rất nhiều tính năng mạnh mẽ trên nền tảng web cũng như trên các ứng dụng di động. Express hỗ rợ các phương thức HTTP và midleware tạo ra môt API vô cùng mạnh mẽ và dễ sử dụng.

Hiểu viết RESTful API là gì?

REST là từ viết tắt của Representational State Transfer. Đó là kiến trúc tiêu chuẩn web và Giao thức HTTP. Hiểu đơn giản thì các ứng dụng RESTful sử dụng các yêu cầu HTTP để thực hiện bốn hoạt động được gọi là CRUD (C: Create, R: Read, U: Update, và D: Delete) Còn muốn hiểu hơn nữa thì hỏi bạn của mình đó là Mr.Google.

Nói chứ không hiểu thì tìm hiểu thêm chứ mất mát cái gì? Bạn có thể bỏ mấy tiếng đồng hồ để lướt FB mà, vậy thì dành cho nó 10 phút là ngon rồi. 

Thôi đi vào vấn đề bây giờ. Express route Bình thường code như thế này:

const getUser = async (req, res, next) => {
    const { id } = req.params;
    const user = await User.findById(id); 
    // f.ex. mongoose findById method
};

router.get("/user/:id", getUser);

Không giải thích nha, vì đã nói ở trước rồi. Dành cho ai đã biết và viết api sử dụng express rồi. Trên đó là cách mà những devjs nào cảm thấy mình thần thánh rồi không cần bắt error nữa thì đến đây dừng đọc được rồi. hehe. 

Tiếp đến ông nào cẩn thận hơn.

const getUser = async (req, res, next) => {
    const { id } = req.params;
    try {
        const user = await User.findById(id); // f.ex. mongoose findById method
    } catch(e) {
        // here goes out error handler
    }
}

router.get("/user/:id", getUser);

Đúng rồi, vỗ tay nào. Dùng try/catch để bắt error là chuyện như ăn cơm trong giới developers rồi. Nhưng dùng lại một chút, chứ nếu có 100 routes thì thế nào, chẳng nhẽ function nào cũng phải copy cái try/catch vậy à??? Câu hỏi đúng rồi đấy, đọc bài này đúng rồi đấy, cách đơn giản hơn rất nhiều. Tạo một function thứ 3 đa số nằm trong file Utils

Util.js

module.exports = fn => (req, res, next) => {
    Promise.resolve(fn(req, res, next))
        .catch(next);
};

Sử dụng: Controller.js

const getUser = async (req, res, next) => {
    const { id } = req.params;
    const user = await User.findById(id); // f.ex. mongoose findById method
}

Routes.js

const asyncMiddleware = require('Util');
router.get("/user/:id", asyncMiddleware(getUser));

Vậy là xong rồi đó. Happy coding! :D

Có thể bạn đã bị missing