Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?

Cevap

Callback, Promise ve async/await

// Callback: hata ilk parametredir (error-first)
fs.readFile("a.txt", (err, data) => {
  if (err) return console.error(err);
});

// Promise
getir().then(isle).catch(err => console.error(err));

// async/await: try/catch
async function siparisOlustur(veri) {
  try {
    const kullanici = await db.kullaniciBul(veri.kullaniciId);
    return await db.siparisEkle(kullanici, veri);
  } catch (err) {
    throw new SiparisHatasi("Sipariş oluşturulamadı", { cause: err });
  }
}

Sık yapılan hatalar

  1. `await` unutmak: try { db.kaydet() } catch {} hatayı yakalamaz; çünkü Promise reddi try bloğu bittikten sonra olur.
  2. Callback içinde throw: setTimeout(() => { throw err }) dıştaki try/catch tarafından yakalanmaz.
  3. forEach ile async: arr.forEach(async x => await f(x)) beklenmez ve hataları kaybolur. for...of veya Promise.all kullanın.
  4. Express 4'te async route: reddedilen Promise hata middleware'ine ulaşmaz. try/catch + next(err) ya da bir sarmalayıcı gerekir. Express 5 bunu otomatik yapar.
const asyncHandler = fn => (req, res, next) =>
  Promise.resolve(fn(req, res, next)).catch(next);

Global yakalayıcılar

process.on("unhandledRejection", (reason) => {
  logger.error({ reason }, "Yakalanmamış promise reddi");
  process.exit(1);
});

process.on("uncaughtException", (err) => {
  logger.fatal(err);
  process.exit(1);
});

Node 15+ yakalanmamış Promise reddinde süreci varsayılan olarak sonlandırır. Bu yakalayıcılar hatayı "kurtarmak" için değil, loglayıp düzgünce kapanmak içindir; uygulama belirsiz durumda kalmasın diye süreç yeniden başlatılır (PM2, Kubernetes).

Operasyonel ve programcı hataları

Operasyonel hatalar (timeout, bulunamayan kayıt, geçersiz girdi) beklenir ve ele alınır. Programcı hataları (undefined okuma, bug) düzeltilmesi gereken kusurlardır; bunlarda süreci yeniden başlatmak daha güvenlidir.

  1. cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?ZorNode.jsBackend
  2. Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?ZorNode.jsBackend
  3. Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?OrtaNode.jsBackend
  4. process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?OrtaNode.jsBackend
  5. Express.js'te middleware nedir ve nasıl çalışır?KolayNode.jsBackend
  6. CommonJS ile ES Modules (ESM) arasındaki fark nedir?KolayNode.jsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle