معرفی
استثناها و خطاها در هنگام تعامل کاربران با هر برنامه ای رخ می دهند، این به مهندسان نرم افزار بستگی دارد که وسیله ای را برای رسیدگی به هر خطایی که ممکن است رخ دهد - آگاهانه یا ناآگاهانه انتخاب کنند. در نتیجه، توسعهدهندگان باطنی که API را با Express میسازند، در تلاش هستند تا اطمینان حاصل کنند که در حال ساخت یک API مفید، کارآمد و قابل استفاده هستند. آنچه از اهمیت بیشتری برخوردار است، رسیدگی به خطاها به گونه ای است که سیستمی قوی بسازید، زیرا این امر به کاهش زمان توسعه، خطاهای آشکار، مسائل مربوط به بهره وری کمک می کند و موفقیت یا مقیاس پذیری توسعه نرم افزار را تعیین می کند.
آیا باید پیام خطا را ثبت کنید، خطا را سرکوب کنید، کاربران را در مورد خطا آگاه کنید یا کد بنویسید تا خطاها را مدیریت کنید؟ جای تعجب نیست.
در این راهنما، ما یاد خواهیم گرفت که چگونه یک پایگاه کد مدیریت خطا برای برنامههای Express بسازیم، که به شناسایی خطاهای برنامه کمک میکند و اقدامات بهینه برای بازیابی هر برنامهای از خرابی دلپذیر در طول زمان اجرا انجام میدهد.
توجه داشته باشید: ما از Postman برای آزمایش API در نسخه نمایشی خود استفاده خواهیم کرد. شما می توانید آن را در صفحه دانلود پستچی. از طرف دیگر، می توانید به سادگی از مرورگر، خط فرمان استفاده کنید curl
ابزار یا هر ابزار دیگری که ممکن است با آن آشنا باشید.
Error Handling چیست؟
در توسعه نرم افزار، دو نوع استثنا وجود دارد: قابل استفاده و برنامه ریزی شده.
- خرابیهای عملیاتی ممکن است در طول زمان اجرا به وجود بیایند، و برای جلوگیری از خاتمه ناگهانی برنامه، باید این استثناها را از طریق روشهای کارآمد مدیریت خطا مدیریت کنیم.
- استثناهای برنامه ای به صورت دستی توسط یک برنامه نویس، زمانی که یک حالت استثنایی ایجاد می شود، پرتاب می شود.
شما می توانید استثناهای عملیاتی را به عنوان استثناهای "غیر منتظره، اما پیش بینی شده" (مانند دسترسی به یک نمایه خارج از محدوده) و استثناهای برنامه ای را به عنوان استثناهای "منتظره و پیش بینی شده" (مانند استثنای قالب بندی اعداد) در نظر بگیرید.
Exception Handling رویه ای است که برای یافتن و رفع عیوب یک برنامه استفاده می شود. مدیریت خطا پیام هایی را ارسال می کند که شامل نوع خطای رخ داده و پشته ای است که در آن خطا رخ داده است.
توجه داشته باشید: در علوم کامپیوتر، استثناها قابل بازیابی هستند و معمولاً از مسائل عملیاتی یا برنامهای در طول زمان اجرا ناشی میشوند. خطاها معمولاً از عوامل خارجی مانند محدودیتهای سختافزاری، مشکلات مربوط به اتصال، کمبود حافظه و غیره ایجاد میشوند. در جاوا اسکریپت، اصطلاحات اغلب به جای یکدیگر استفاده میشوند و استثناهای سفارشی از Error
کلاس Error
خود کلاس هم خطاها و هم استثناها را نشان می دهد.
در Express، مدیریت استثنا به نحوه تنظیم Express خود برای گرفتن و پردازش استثناهای همزمان و ناهمزمان اشاره دارد. خوبی در مورد رسیدگی به استثنا در Express این است که به عنوان یک توسعه دهنده، نیازی نیست که کنترل کننده های استثنای خود را بنویسید. Express با یک کنترل کننده استثنا پیش فرض ارائه می شود. کنترل کننده استثنا به شناسایی خطاها و گزارش آنها به کاربر کمک می کند. همچنین استراتژی های اصلاحی مختلفی را ارائه می کند و آنها را برای کاهش استثناها اجرا می کند.
در حالی که این موارد ممکن است به نظر چیزهای زیادی باشد، مدیریت استثنا در Express روند کلی یک برنامه را کند نمی کند یا اجرای آن را متوقف نمی کند.
درک موارد استثنایی در اکسپرس
با کنترل کننده خطای پیشفرض که با Express ارائه میشود، مجموعهای از توابع میانافزاری در دست داریم که به کشف خودکار خطاها در کنترلکنندههای مسیر کمک میکنند. بهزودی، پروژهای ایجاد خواهیم کرد تا تئوری را در مورد نحوه بازگرداندن خطاهای مناسب در یک برنامه Express و نحوه درز نکردن اطلاعات حساس در عمل ایجاد کنیم.
تعریف تابع میان افزار در Express
توابع میان افزار رسیدگی به خطا به گونه ای تعریف شده اند که یک را بپذیرند Error
شی به عنوان اولین پارامتر ورودی و به دنبال آن پارامترهای پیش فرض هر تابع میان افزار دیگر: request
, response
و next
. next()
تابع تمام میان افزارهای فعلی را به کنترل کننده خطای بعدی روتر پرش می کند.
راه اندازی رسیدگی به خطا در Express
دستور زیر را در ترمینال خود اجرا کنید تا یک برنامه Node and Express ایجاد کنید:
$ mkdir error-handling-express
در پوشه جدید ایجاد شده، اجازه دهید یک پروژه Node جدید را مقداردهی اولیه کنیم:
$ cd error-handling-express && npm init -y
این یک ایجاد می کند package.json
فایل در پوشه ما
برای ایجاد یک سرور Express در برنامه Node خود، باید آن را نصب کنیم express
بسته بندی، dotenv
برای بارگیری خودکار متغیرهای محیطی در .env
فایل به process.env
شی، و nodemon
برای راه اندازی مجدد برنامه گره در صورت مشاهده تغییر فایل در فهرست.
$ npm install express dotenv nodemon
بعد، یک را ایجاد کنید app.js
فایل در پوشه پروژه که به عنوان فایل فهرست برنامه عمل می کند.
اکنون که همه وابستگی های مورد نیاز را برای برنامه Express خود نصب کرده ایم، باید اسکریپت خواندن برنامه را در برنامه تنظیم کنیم. package.json
فایل. برای رسیدن به آن، package.json
فایل، به طوری که scripts
شی مانند شکل زیر است:
"scripts": {
"start": "nodemon app.js"
},
از طرف دیگر، می توانید از استفاده خودداری کنید nodemon
، و استفاده کنید node app.js
به جای آن.
راه اندازی سرور اکسپرس
برای راه اندازی سرور، ابتدا باید بسته های مختلف را وارد کنیم app.js
. ما همچنین یک را ایجاد خواهیم کرد .env
فایل در دایرکتوری پروژه - برای ذخیره همه متغیرهای محیطی برای برنامه:
const express = require('express')
require('dotenv').config
PORT=4000
ما شماره پورت برنامه را در آن تعریف کرده ایم .env
، که در بارگذاری شده و توسط آن خوانده می شود dotenv
، و بعداً قابل دسترسی است.
راه اندازی سرور اکسپرس
اکنون، ما باید سرور Express را مقداردهی اولیه کنیم و برنامه خود را مجبور کنیم به شماره پورت برنامه، همراه با درخواست یک مسیر آزمایشی، گوش دهد. /test
. بیایید به روز کنیم app.js
، در زیر بیانیه های واردات:
const app = express();
const port = process.env.PORT || 4000;
app.get("/test", async (req, res) => {
return res.status(200).json({ success: true });
});
app.listen(port, () => {
console.log(`Server is running at port ${port}`);
});
از اینجا به بعد، نحوه رسیدگی به موارد استفاده مختلف از خطاهای عملیاتی که ممکن است در Express وجود داشته باشد را یاد خواهیم گرفت.
مدیریت خطاهای یافت نشد در Express
فرض کنید باید همه کاربران را از پایگاه داده کاربران واکشی کنید، میتوانید با قرار دادن منطق در یک سناریوی خطای احتمالی که در آن هیچ دادهای در پایگاه داده وجود ندارد، به طور موثر مدیریت کنید. try/catch
بلوک - به امید اینکه هر خطایی را که می تواند در آن ایجاد شود، پیدا شود catch
مسدود کردن:
const getUser = () => undefined;
app.get("/get-user", async (req, res) => {
try {
const user = getUser();
if (!user) {
throw new Error('User not found');
}
} catch (error) {
console.log(error);
res.status(400).send(error.message)
}
return res.status(200).json({
success: true
});
});
این نتیجه در:
User not found
اکنون، هنگامی که این درخواست انجام می شود (می توانید با استفاده از Postman تست کنید) و هیچ کاربری در پایگاه داده وجود ندارد، مشتری یک پیغام خطایی دریافت می کند که می گوید "کاربر پیدا نشد". همچنین، متوجه خواهید شد که خطا در کنسول نیز ثبت شده است.
بهینه سازی مدیریت خطا با میان افزار کنترل کننده خطا
ما میتوانیم با ایجاد یک میانافزار کنترلکننده خطا که در انتهای تمام مسیرهای تعریفشده قرار میگیرد، توسعه را بهینه کنیم، به طوری که اگر خطایی در یکی از مسیرها رخ دهد، Express بهطور خودکار به میانافزار بعدی نگاه میکند و به پایین لیست ادامه میدهد. تا زمانی که به کنترل کننده خطا برسد. کنترل کننده خطا خطا را پردازش می کند و همچنین پاسخی را برای مشتری ارسال می کند.
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
برای شروع، یک پوشه به نام ایجاد کنید middleware
در پوشه پروژه و در این پوشه فایلی به نام ایجاد کنید errorHandler.js
که کنترل کننده خطا را تعریف می کند:
const errorHandler = (error, req, res, next) => {
console.log(error);
res.status(400).send(error.message);
}
module.exports = errorHandler;
در تابع میانافزار خود، با افزودن error
پارامتر قبل از 3 پارامتر اصلی.
اکنون، از کنترل کننده خطا در نسخه ی نمایشی خود استفاده می کنیم app.js
و خطای اولیه واکشی کاربران را با میان افزار کنترل کننده خطا مانند شکل زیر مدیریت کنید:
const getUser = () => undefined;
app.get("/get-user", async (req, res, next) => {
try {
const user = getUser();
if (!user) {
throw new Error("User not found");
}
} catch (error) {
return next(error);
}
});
app.use(errorHandler);
ما میتوانیم با ایجاد یک انتزاع در اطراف کد خود را حتی بیشتر بهینه کنیم try/catch
منطق. ما می توانیم با ایجاد یک پوشه جدید در فهرست پروژه به این هدف دست یابیم utils
و در آن فایلی به نام ایجاد کنید tryCatch.js
.
برای انتزاع کردن try-catch
منطق - ما می توانیم تابعی را تعریف کنیم که تابع دیگری را بپذیرد (معروف به the کنترل کننده) به عنوان پارامتر آن است و an را برمی گرداند async
تابعی که a را نگه می دارد try/catch
برای هر کنترل کننده دریافت شده
اگر خطایی در کنترلر رخ دهد، در کنترلر گرفته می شود catch
بلوک و تابع بعدی نامیده می شود:
const tryCatch = (controller) => async (req, res, next) => {
try {
await controller(req, res);
} catch (error) {
return next(error);
}
};
module.exports = tryCatch;
با try/catch
انتزاع، ما میتوانیم کد خود را با رد کردن از کد خود برای موجزتر کردن آن بازسازی کنیم try-catch
بند به صراحت هنگام واکشی کاربران در app.js
:
const getUser = () => undefined;
app.get(
"/get-user",
tryCatch(async (req, res) => {
const user = getUser();
if (!user) {
throw new Error("User not found");
}
res.status(400).send(error.message);
})
);
ما با موفقیت منطق try-catch را انتزاع کردیم و کد ما همچنان مانند قبل کار می کند.
رسیدگی به خطاهای اعتبارسنجی در Express
برای این نسخه آزمایشی، ما یک مسیر جدید در برنامه Express خود برای ورود ایجاد خواهیم کرد - برای تأیید اعتبار شناسه کاربر پس از ورود به سیستم. ابتدا، ما را نصب خواهیم کرد. joi
بسته، برای کمک به ایجاد یک طرحواره، که با آن می توانیم الزامات را اعمال کنیم:
$ npm i joi
بعد، یک طرحواره ایجاد کنید که a Joi.object
با یک userId
که باید یک عدد باشد و الزامی است - به این معنی که درخواست باید با یک شی با شناسه کاربری روی آن مطابقت داشته باشد.
ما می توانیم از validate()
روشی در شی schema برای اعتبارسنجی هر ورودی در برابر طرحواره:
const schema = Joi.object({
userId: Joi.number().required(),
});
app.post(
"/login",
tryCatch(async (req, res) => {
const {error, value} = schema.validate({});
if (error) throw error;
})
);
اگر یک شی خالی به validate()
با روش، خطا به خوبی مدیریت می شود و پیام خطا برای مشتری ارسال می شود:
در کنسول، ما همچنین به a دسترسی داریم details
آرایه ای که شامل جزئیات مختلفی در مورد خطا است که در صورت نیاز می تواند به کاربر اطلاع داده شود.
برای رسیدگی خاص به خطاهای اعتبارسنجی به گونهای که جزئیات خطای مناسب را به ازای هر خطای اعتبارسنجی ارسال کند، میانافزار کنترلکننده خطا را میتوان مجدداً اصلاح کرد:
const errorHandler = (error, req, res, next) => {
console.log(error);
if (error.name === "ValidationError") {
return res.status(400).send({
type: "ValidationError",
details: error.details,
});
}
res.status(400).send(error.message);
};
module.exports = errorHandler;
با errorHandler.js
در حال حاضر سفارشی شده است، زمانی که ما همان درخواست را با یک شی خالی ارسال می کنیم validate()
روش:
ما اکنون به یک شی سفارشی دسترسی داریم که پیام ها را به شیوه ای خوانا/دوستانه تر برمی گرداند. به این ترتیب، ما قادر به ارسال و رسیدگی به انواع مختلف خطاها بر اساس نوع خطای ورودی هستیم.
نتیجه
در این راهنما، همه جنبههای مدیریت خطای Express.js را بررسی کردیم، از جمله نحوه مدیریت کدهای همزمان و ناهمزمان بهطور پیشفرض، نحوه ایجاد کلاسهای خطا، نحوه نوشتن توابع میانافزار مدیریت خطای سفارشی و ارائه next
به عنوان نگهدارنده نهایی شکار
مانند هر کار دیگری، در طول توسعه نیز بهترین شیوهها وجود دارد که شامل مدیریت موثر خطا میشود، و امروز آموختهایم که چگونه میتوانیم خطاها را در یک برنامه Express به روشی قوی مدیریت کنیم.
مدیریت صحیح خطاها تنها به معنای کاهش زمان توسعه با یافتن آسان باگ ها و خطاها نیست، بلکه به معنای ایجاد یک پایگاه کد قوی برای برنامه های کاربردی در مقیاس بزرگ است. در این راهنما نحوه راه اندازی میان افزار برای مدیریت خطاهای عملیاتی را دیدیم. برخی از راههای دیگر برای بهبود مدیریت خطا عبارتند از: ارسال نکردن ردیابی پشتهها، توقف فرآیندها بهخوبی برای رسیدگی به استثنائات کشف نشده، ارائه پیامهای خطای مناسب، ارسال گزارشهای خطا، و راهاندازی کلاسی که دامنه را گسترش میدهد. Error
کلاس.
امیدوارم مثال هایی که در این آموزش استفاده کردم برای شما لذت بخش بوده باشد. من سناریوهای مختلفی را پوشش دادم که ممکن است هنگام نوشتن یک برنامه Express برای استفاده در دنیای واقعی در مورد مدیریت خطا با آنها روبرو شوید. لطفا اگر موردی بود که از قلم افتادم به من اطلاع دهید. این برای ما مفید خواهد بود و به من کمک می کند تا بیشتر یاد بگیرم. روز خوبی داشته باشید و ممنون که خواندید.
می توانید به تمام کدهای منبع استفاده شده در مقاله در مورد مراجعه کنید گیتهاب.