از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
راهنمای رسیدگی به استثناء در ExpressException ها و خطاها در هنگام تعامل کاربران با هر برنامه ای رخ می دهند، این به مهندسان نرم افزار بستگی دارد که وسیله ای را برای رسیدگی به هر خطایی که ممکن است رخ دهد – آگاهانه یا ناآگاهانه انتخاب کنند. در نتیجه، توسعه دهندگان باطنی که API را با Express می سازند، در تلاش هستند تا مطمئن شوند که…
سرفصلهای مطلب
معرفی
استثناها و خطاها در هنگام تعامل کاربران با هر برنامه ای رخ می دهند، این به مهندسان نرم افزار بستگی دارد که وسیله ای را برای رسیدگی به هر خطایی که ممکن است رخ دهد – آگاهانه یا ناآگاهانه انتخاب کنند. در نتیجه، توسعهدهندگان باطنی که API را با Express میسازند، در تلاش هستند تا اطمینان حاصل کنند که در حال ساخت یک API مفید، کارآمد و قابل استفاده هستند. آنچه از اهمیت بیشتری برخوردار است، رسیدگی به خطاها به گونه ای است که سیستمی قوی بسازید، زیرا این امر به کاهش زمان توسعه، خطاهای آشکار، مسائل مربوط به بهره وری کمک می کند و موفقیت یا مقیاس پذیری توسعه نرم افزار را تعیین می کند.
آیا باید پیام خطا را ثبت کنید، خطا را سرکوب کنید، کاربران را در مورد خطا آگاه کنید یا کد بنویسید تا خطاها را مدیریت کنید؟ جای تعجب نیست.
در این راهنما، ما یاد خواهیم گرفت که چگونه یک پایگاه کد مدیریت خطا برای برنامههای Express بسازیم، که به شناسایی خطاهای برنامه کمک میکند و اقدامات بهینه برای بازیابی هر برنامهای از خرابی دلپذیر در طول زمان اجرا انجام میدهد.
توجه داشته باشید: ما از Postman برای آزمایش API در نسخه نمایشی خود استفاده خواهیم کرد. می توانید آن را دانلود کنید روی را پستچی دانلود page. از طرف دیگر، می توانید به سادگی از مرورگر استفاده کنید command-line curl
ابزار یا هر ابزار دیگری که ممکن است با آن آشنا باشید.
Error Handling چیست؟
در توسعه نرم افزار، دو نوع استثنا وجود دارد: عملیاتی و برنامه ای.
- خرابیهای عملیاتی ممکن است در طول زمان اجرا به وجود بیایند، و برای جلوگیری از خاتمه ناگهانی برنامه، باید این استثناها را از طریق روشهای کارآمد مدیریت خطا مدیریت کنیم.
- استثناهای برنامه ای به صورت دستی توسط یک برنامه نویس، زمانی که یک حالت استثنایی ایجاد می شود، پرتاب می شود.
شما می توانید استثناهای عملیاتی را به عنوان استثناهای “غیر منتظره، اما پیش بینی شده” (مانند دسترسی به یک نمایه خارج از محدوده) و استثناهای برنامه ای را به عنوان استثناهای “منتظره و پیش بینی شده” (مانند استثنای قالب بندی اعداد) در نظر بگیرید.
Exception Handling رویه ای است که برای یافتن و رفع عیوب یک برنامه استفاده می شود. مدیریت خطا پیام هایی را ارسال می کند که شامل نوع خطای رخ داده و پشته ای است که در آن خطا رخ داده است.
توجه داشته باشید: در علوم کامپیوتر، استثناها قابل بازیابی هستند و معمولاً از مسائل عملیاتی یا برنامهای در طول زمان اجرا ناشی میشوند. خطاها معمولاً از عوامل خارجی مانند محدودیتهای سختافزاری، مشکلات مربوط به اتصال، کمبود حافظه و غیره ایجاد میشوند. در جاوا اسکریپت، اصطلاحات اغلب به جای یکدیگر استفاده میشوند و استثناهای سفارشی از Error
کلاس را Error
خود کلاس هم خطاها و هم استثناها را نشان می دهد.
در Express، رسیدگی به استثنا به این اشاره دارد که چگونه Express خود را برای گرفتن و تنظیم می کند process استثناهای همزمان و ناهمزمان خوبی در مورد رسیدگی به استثنا در Express این است که به عنوان یک توسعه دهنده، نیازی نیست که کنترل کننده های استثنای خود را بنویسید. Express با یک کنترل کننده استثنا پیش فرض ارائه می شود. کنترل کننده استثنا به شناسایی خطاها و گزارش آنها به کاربر کمک می کند. همچنین استراتژی های اصلاحی مختلفی را ارائه می کند و آنها را برای کاهش استثناها اجرا می کند.
در حالی که به نظر می رسد موارد زیادی در زیر کاپوت وجود دارد، کنترل استثنا در Express سرعت کلی را کاهش نمی دهد. process یک برنامه یا توقف اجرای آن.
درک موارد استثنایی در اکسپرس
با کنترلکننده خطای پیشفرض که با Express ارائه میشود، مجموعهای از توابع میانافزار در دست داریم که به کشف خودکار خطاها در کنترلکنندههای مسیر کمک میکنند. به زودی پروژه ای برای اجرای تئوری ایجاد خواهیم کرد روی چگونه خطاهای مناسب را در یک برنامه Express برگردانیم و چگونه اطلاعات حساس را درز نکنیم.
تعریف تابع میان افزار در Express
توابع میان افزار رسیدگی به خطا به گونه ای تعریف شده اند که یک را بپذیرند Error
شی به عنوان اولین پارامتر ورودی و به دنبال آن پارامترهای پیش فرض هر تابع میان افزار دیگر: request
، response
، و next
. را next()
تابع تمام میان افزارهای فعلی را به کنترل کننده خطای بعدی روتر پرش می کند.
راه اندازی رسیدگی به خطا در Express
دستور زیر را در خود اجرا کنید terminal برای ایجاد یک برنامه Node و Express:
$ mkdir error-handling-express
در پوشه جدید ایجاد شده، اجازه دهید یک پروژه Node جدید را مقداردهی اولیه کنیم:
$ cd error-handling-express && npm init -y
این باعث ایجاد یک package.json
فایل در پوشه ما
برای ایجاد یک سرور Express در برنامه Node خود، باید آن را نصب کنیم express
بسته، dotenv
برای بارگیری خودکار متغیرهای محیطی در .env
فایل به process.env
شیء، و nodemon
برای راه اندازی مجدد node اگر تغییر فایل در دایرکتوری ذکر شده باشد، برنامه.
$ npm install express dotenv nodemon
بعد، یک را ایجاد کنید app.js
فایل در پوشه پروژه که به عنوان فایل فهرست برنامه عمل می کند.
اکنون که همه وابستگی های مورد نیاز را برای برنامه Express خود نصب کرده ایم، باید اسکریپت خواندن برنامه را در برنامه تنظیم کنیم. package.json
فایل. برای رسیدن به آن، package.json
فایل، به طوری که scripts
شی مانند شکل زیر است:
"scripts": {
"start": "nodemon app.js"
},
از طرف دیگر، می توانید از استفاده خودداری کنید nodemon
، و استفاده کنید node app.js
بجای.
راه اندازی سرور اکسپرس
برای راه اندازی سرور، ابتدا باید import بسته های مختلف را در app.js
. ما همچنین یک را ایجاد خواهیم کرد .env
فایل در دایرکتوری پروژه – برای ذخیره همه متغیرهای محیطی برای برنامه:
// app.js
const express = require('express')
require('dotenv').config
//.env
PORT=4000
ما شماره پورت برنامه را در آن تعریف کرده ایم .env
، که در بارگذاری شده و توسط آن خوانده می شود dotenv
، و بعداً قابل دسترسی است.
راه اندازی سرور اکسپرس
اکنون، باید سرور Express را مقداردهی اولیه کنیم و برنامه خود را به شماره پورت برنامه همراه با درخواست یک مسیر آزمایشی گوش دهد – /test
. بیایید به روز کنیم app.js
، در زیر import بیانیه:
// 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
مسدود کردن:
//app.js
const getUser = () => undefined;
app.get("/get-user", async (req, res) => {
try {
const user = getUser();
if (!user) {
throw new Error('User not found');
}
} catch (error) {
// Logging the error here
console.log(error);
// Returning the status and error message to client
res.status(400).send(error.message)
}
return res.status(200).json({
success: true
});
});
این نتیجه در:
User not found
حالا وقتی این درخواست انجام شد (می توانید با استفاده از Postman تست کنید) و کاربری وجود ندارد روی در پایگاه داده، مشتری یک پیغام خطایی دریافت می کند که می گوید “کاربر پیدا نشد”. همچنین، متوجه خواهید شد که خطا در سیستم ثبت شده است console، هم.
بهینه سازی مدیریت خطا با میان افزار کنترل کننده خطا
ما میتوانیم با ایجاد یک میانافزار کنترلکننده خطا که در انتهای تمام مسیرهای تعریفشده قرار میگیرد، توسعه را بهینه کنیم، به طوری که اگر خطایی در یکی از مسیرها رخ دهد، Express بهطور خودکار به میانافزار بعدی نگاه میکند و به پایین لیست ادامه میدهد. تا زمانی که به کنترل کننده خطا برسد. کنترل کننده خطا این کار را انجام خواهد داد process خطا و همچنین ارسال پاسخ به مشتری.
برای شروع، یک پوشه به نام ایجاد کنید middleware
در پوشه پروژه و در این پوشه فایلی به نام ایجاد کنید errorHandler.js
که کنترل کننده خطا را تعریف می کند:
const errorHandler = (error, req, res, next) => {
// Logging the error here
console.log(error);
// Returning the status and error message to client
res.status(400).send(error.message);
}
module.exports = errorHandler;
در تابع میانافزار خود، با افزودن error
پارامتر قبل از 3 پارامتر اصلی.
اکنون، از کنترل کننده خطا در نسخه ی نمایشی خود استفاده می کنیم app.js
و خطای اولیه واکشی کاربران را با میان افزار کنترل کننده خطا مانند شکل زیر مدیریت کنید:
// 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
بلوک و تابع بعدی نامیده می شود:
// tryCatch.js
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
:
// 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 برای اعتبارسنجی هر ورودی در برابر طرحواره:
// app.js
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()
با روش، خطا به خوبی مدیریت می شود و پیام خطا برای مشتری ارسال می شود:
در console، ما همچنین به a دسترسی داریم details
آرایه ای که شامل جزئیات مختلفی در مورد خطا است که در صورت نیاز می تواند به کاربر اطلاع داده شود.
برای رسیدگی خاص به خطاهای اعتبارسنجی به گونهای که جزئیات خطای مناسب را به ازای هر خطای اعتبارسنجی ارسال کند، میانافزار کنترلکننده خطا را میتوان مجدداً اصلاح کرد:
// errorHandler.js
const errorHandler = (error, req, res, next) => {
console.log(error); // logging the error here
if (error.name === "ValidationError") {
return res.status(400).send({
type: "ValidationError",
details: error.details,
});
}
res.status(400).send(error.message); // returning the status and error message to client
};
module.exports = errorHandler;
با errorHandler.js
در حال حاضر سفارشی شده است، زمانی که ما همان درخواست را با یک شی خالی ارسال می کنیم validate()
روش:
ما اکنون به یک شی سفارشی دسترسی داریم که پیام ها را به شیوه ای خوانا/دوستانه تر برمی گرداند. به این ترتیب، ما قادر به ارسال و رسیدگی به انواع مختلف خطاها هستیم روی نوع خطایی که وارد می شود
نتیجه
در این راهنما، همه جنبههای مدیریت خطای Express.js را بررسی کردیم، از جمله روش مدیریت کدهای همزمان و ناهمزمان بهطور پیشفرض، روش ایجاد کلاسهای خطا، روش نوشتن توابع میانافزار مدیریت خطای سفارشی و ارائه next
به عنوان نگهدارنده نهایی شکار
مانند هر کار دیگری، در طول توسعه نیز بهترین شیوهها وجود دارد که شامل مدیریت موثر خطا میشود، و امروز آموختهایم که چگونه میتوانیم خطاها را در یک برنامه Express به روشی قوی مدیریت کنیم.
مدیریت صحیح خطاها تنها به معنای کاهش زمان توسعه با یافتن آسان باگ ها و خطاها نیست، بلکه به معنای ایجاد یک پایگاه کد قوی برای برنامه های کاربردی در مقیاس بزرگ است. در این راهنما روش راه اندازی میان افزار برای مدیریت خطاهای عملیاتی را دیدیم. برخی از راههای دیگر برای بهبود مدیریت خطا عبارتند از: ارسال نکردن ردیابی پشتهها، توقف فرآیندها بهخوبی برای رسیدگی به استثنائات کشف نشده، ارائه پیامهای خطای مناسب، ارسال گزارشهای خطا، و راهاندازی کلاسی که دامنه را گسترش میدهد. Error
کلاس
امیدوارم مثال هایی که در این آموزش استفاده کردم برای شما لذت بخش بوده باشد. من سناریوهای مختلفی را پوشش دادم که ممکن است هنگام نوشتن یک برنامه Express برای استفاده در دنیای واقعی در مورد مدیریت خطا با آنها روبرو شوید. لطفا اگر موردی بود که از قلم افتادم به من اطلاع دهید. این برای ما مفید خواهد بود و به من کمک می کند تا بیشتر یاد بگیرم. روز خوبی داشته باشید و ممنون که خواندید.
می توانید به تمام کدهای منبع استفاده شده در مقاله مراجعه کنید روی GitHub.
منابع اضافی
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-05 17:17:07