0

Top 5 Sai Lầm Khi Xử Lý Async Trong Node.js

Node.js nổi tiếng với khả năng xử lý bất đồng bộ (async) siêu mượt, nhờ vào event loop và non-blocking I/O. Nhưng nếu bạn không hiểu rõ cơ chế này, rất dễ dính “bug vô hình” hoặc làm hiệu năng tụt dốc không phanh.

Dưới đây là 5 sai lầm phổ biến nhất khi xử lý async mà mình gặp thấy (và từng phạm phải 😅):


1. Quên await hoặc .then() khi gọi hàm async

Ví dụ sai:

const data = fetchData(); // fetchData là hàm async
console.log(data); // sẽ in ra Promise { <pending> }

Giải pháp đúng:

const data = await fetchData();

Hoặc:

fetchData().then(data => console.log(data));

Nhớ: Nếu bạn thấy output là [object Promise], tức là bạn đã quên await.

2. Dùng await trong vòng lặp forEach

myArray.forEach(async (item) => {
  await doSomething(item); // KHÔNG hoạt động như bạn nghĩ
});

forEach không đợi await, nên mọi thứ chạy cùng lúc.

Cách đúng:

for (const item of myArray) {
  await doSomething(item);
}

Hoặc nếu muốn chạy song song:

await Promise.all(myArray.map(item => doSomething(item)));

3. Không xử lý lỗi với try/catch hoặc .catch()

const result = await mayThrowError(); // nếu lỗi xảy ra, app crash

Nên bọc trong try/catch:

try {
  const result = await mayThrowError();
} catch (err) {
  console.error('Error happened:', err);
}

Hoặc với Promise:

mayThrowError().catch(err => console.error(err));

4. Chặn event loop bằng tác vụ đồng bộ nặng

app.get('/', (req, res) => {
  // Blocking code
  for (let i = 0; i < 1e10; i++) {}
  res.send('Done');
});

Tác vụ trên sẽ** chặn toàn bộ server**, vì JavaScript chỉ có 1 thread chạy chính.

Cách giải quyết:

  • Tách ra thành child process hoặc
  • Dùng Worker Threads nếu là Node >= 12
  • Hoặc đơn giản: tránh xử lý nặng trong main thread

5. Không chờ tất cả Promise hoàn thành

const tasks = [task1(), task2(), task3()];
tasks.forEach(async t => await t); // SAI – không đợi

Cách đúng:

await Promise.all([task1(), task2(), task3()]);

Tổng kết

Xử lý async là cốt lõi của Node.js, nhưng cũng dễ gây "ngơ ngác, bật ngửa" nếu bạn chưa quen. Nắm chắc các nguyên tắc trên sẽ giúp bạn:

  • Viết code rõ ràng, dễ debug
  • Tránh bug ngầm
  • Tối ưu hiệu năng hệ thống

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí