Bạn có cảm thấy chán khi sử dụng Try-Catch?
Khi xây dựng ứng dụng web với Express, xử lý lỗi là một trong những yếu tố quan trọng nhất để đảm bảo ứng dụng hoạt động trơn tru và mang lại trải nghiệm tốt cho người dùng. Xử lý lỗi không đúng cách có thể dẫn đến ứng dụng bị crash, phản hồi không thân thiện với người dùng, và gây khó khăn cho cả lập trình viên lẫn người sử dụng.
Trong các ứng dụng JavaScript hiện đại, sử dụng hàm bất đồng bộ (async/await) ngày càng phổ biến, và điều này khiến việc xử lý lỗi trở nên quan trọng hơn bao giờ hết.
Hàm catchAsync này sẽ giúp bạn tối ưu hóa và sắp xếp mã của mình:
import { NextFunction, Request, RequestHandler, Response } from "express";
export const catchAsync = (fn: RequestHandler) => {
return async (req: Request, res: Response, next: NextFunction) => {
try {
await fn(req, res, next);
} catch (error) {
next(error);
}
};
};
Nó hoạt động như thế nào?
🔹 Nhận một hàm bất đồng bộ
catchAsync nhận vào một hàm xử lý tuyến đường (fn), thường là một hàm async xử lý các yêu cầu HTTP.
🔹 Thực thi hàm đó
Hàm được bọc trong một middleware và được thực thi một cách bất đồng bộ. Nếu mọi thứ chạy đúng, nó tiếp tục hoạt động như bình thường.
🔹 Bắt lỗi tự động
Nếu có lỗi xảy ra trong quá trình thực thi (ví dụ như lỗi truy vấn cơ sở dữ liệu), catchAsync sẽ tự động bắt lỗi đó.
🔹 Chuyển lỗi đến middleware xử lý lỗi
Bất kỳ lỗi nào được bắt sẽ được chuyển tiếp đến middleware tiếp theo bằng cách gọi next(error), giúp bạn xử lý tất cả lỗi một cách tập trung.
Sử dụng catchAsync trong ứng dụng của bạn
Sau đây là cách bạn có thể sử dụng tiện ích CatchAsync trong trình xử lý route của mình:
import express from "express";
import { catchAsync } from "./catchAsync"; // Importing our custom utility
const app = express();
// Sample asynchronous route handler
const getUserData = async (req: Request, res: Response, next: NextFunction) => {
const userData = await fetchUserDataFromDatabase(req.params.id); // Assume async DB call
res.json(userData);
};
// Use the catchAsync utility to wrap your async route handler
app.get('/user/:id', catchAsync(getUserData));
// Global error handler
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
console.error(err);
res.status(500).send({ error: err.message });
});
app.listen(3000, () => {
console.log("Server is running on http://localhost:3000");
});
Lợi Ích của catchAsync
- Code gọn gàng hơn: Bạn không cần phải viết try-catch trong mọi route handler, giúp mã nguồn sạch hơn và dễ bảo trì hơn.
- Xử lý lỗi tập trung: Tất cả các lỗi (bao gồm cả lỗi đồng bộ và bất đồng bộ) đều được chuyển về middleware xử lý lỗi chung, giúp tổ chức code rõ ràng hơn.
- Dễ debug hơn: Vì lỗi luôn được chuyển đến middleware xử lý lỗi, bạn có thể dễ dàng theo dõi và gỡ lỗi từ một nơi duy nhất mà không cần lo lắng về việc bỏ sót lỗi.
Với catchAsync
, bạn có thể quên đi những khối try-catch rườm rà và tập trung vào việc xây dựng ứng dụng Express một cách mượt mà hơn!
Cảm ơn các bạn đã theo dõi!
All rights reserved