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
- `await` unutmak:
try { db.kaydet() } catch {}hatayı yakalamaz; çünkü Promise reddi try bloğu bittikten sonra olur. - Callback içinde throw:
setTimeout(() => { throw err })dıştaki try/catch tarafından yakalanmaz. - forEach ile async:
arr.forEach(async x => await f(x))beklenmez ve hataları kaybolur.for...ofveyaPromise.allkullanın. - 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.
İlgili Node.js soruları
- cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?
- Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?
- process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?
- Express.js'te middleware nedir ve nasıl çalışır?
- CommonJS ile ES Modules (ESM) arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.