14. مدیریت خطاها در Express

در طول برنامه ای که می نویسیم ، احتمال داره خطاهای ناخواسته ای رخ بده ، مثلا خطاهایی مربوط به دیتاهای ورودی یا اشکال در ارتباط با دیتابیس و ...

امروز ( روز چهاردهم) میخوایم یک میان افزار بنویسیم که همه خطاها رو دریافت و هندل کنه.

اون رو به صورت یک میان افزار تعریف میکنیم ، با این تفاوت که چهار متغییر ورودی داره( خطا رو هم به عنوان متغییر دریافت می کنه)

app.use((error,req,res,next)=>{
console.log('Error code:' + error.message); 
next(); })

من این کد رو در فایل app.js نوشتم در کنار بقیه میان افزارها تعریف کردم.

حالا برای تست برنامه میرم توی فایل mainRouter و در مسیر زیر یک خطا ایجاد میکنم:

mainRouter.get('/signin',(req,res)=>{ 
throw new Error('sign in error'); 
console.log(__dirname);
res.sendFile(path.resolve('./views/login.html')); });

برای اینکه در صورت وقوع خطا بتونیم برنامه رو پاس بدیم به error handler یه تغییری در این مسیر باید بدیم به صورت زیر:

mainRouter.get('/signin',(req,res,next)=>{
try{
throw new Error('sign in error');
console.log(__dirname);
res.sendFile(path.resolve('./views/login.html'));
} catch(error){
next(error) }

اون بخشی از برنامه رو که احتمال میدیم خطایی ایجاد کنه در داخل بلاک try-catch قرار میدهیم. اگر بخش try با خطا اجرا شد برنامه کراش نمیشود و بخش catch اجرا می شود که در اینجا نیز ما برنامه رو مستقیما به میان افزار خطاها ارسال میکنیم. در حال حاضر فقط یک کنسول لاگ نمایش میدهیم.

در روز بعدی یک صفحه مخصوص خطاها ایجاد می کنیم تا در صورت بروز خطا آن صفحه به نمایش در بیاید.