رسیدگی به خطای سرور Express.js توضیح داده شد

مدیریت موثر خطا در وب سرور یکی از اجزای حیاتی در توسعه یک سیستم انعطاف پذیر است، زیرا زمانی که یک خطا به طور موثر مدیریت می شود، احتمال کمتری دارد که هنگام بروز مشکل عصبانی شوید. با ارائه اطلاعات مفید و کد خطای دقیق، قادر به عیب یابی سریع خواهید بود.
در این مقاله فقط به خطاهای عملیاتی پرداخته خواهد شد. قبل از اینکه به نحوه رسیدگی به خرابی های عملیاتی بپردازیم، اجازه دهید یک سرور node.js با استفاده از express.js بسازیم. Express.js بر روی node.js ساخته شده است، یک موتور قدرتمند جاوا اسکریپت که برنامه نویسی سمت سرور را امکان پذیر می کند.
فهرست مطالب
راه اندازی اکسپرس سرور
ساخت مولفه ها برای مقابله موثر با خطاها
ایجاد نقطه پایانی
خطاهای نمونه وب سرور
بیایید شیرجه بزنیم 🦅
راه اندازی اکسپرس سرور
ایجاد پروژه
mkdir error-handling
cd error-handling
npm init
npm i express nodemon
- از mkdir برای ایجاد یک پوشه در دایرکتوری ریشه و انتقال آن استفاده کنید
(cd)
به پوشه ای که ایجاد شده است. - ایجاد یک
package.json
که تمام وابستگی هایی را که برای این مقاله استفاده خواهد شد، ثبت خواهد کرد. - وابستگی های زیر را نصب کنید.
-
nodemon
برای گوش دادن به تغییرات در فایل منبع و راه اندازی مجدد سرور
در حال اجرا سرور
(app.js)
const app = express();
const PORT = 3000;
app.get("https://dev.to/", (req, res) => {
res.send('Welcome to error handling in Express :)');
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`)
});
- که در
app.js
یک نمونه از express ایجاد کنید - سرور را ایجاد کنید و به درخواست HTTP ورودی در پورت 3000 گوش دهید.
- مسیر اصلی که HTTP را مدیریت می کند را تعریف کنید
GET
درخواست
{
"name": "error-handling",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "nodemon app.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.2",
"joi": "^17.9.2",
"nodemon": "^2.0.22"
}
}
- اضافه کردن یک اسکریپت شروع در
package.json
فایل، اسکریپت شروع سرور را با استفاده از آن شروع می کندnodemon
. - در حال دویدن پستچی
localhost:3000/
هورای ما سرورمون رو داریم 🎉
ساخت مولفه ها برای مقابله موثر با خطاها
میان افزار کنترل کننده خطا: هر کدی که بین درخواست و پاسخ اجرا شود، میان افزار نامیده می شود. میان افزار کنترل کننده خطا در این سناریو انتزاعی از بسیاری از خطاهایی است که در سرور مدیریت می شود.
- خطا، درخواست، پاسخ و پارامترهای بعدی را می پذیرد.
- اگر خطای ارسال شده نمونه ای از AppError سفارشی باشد،
handleError
تابع با statusCode، errorMessage و errorStatus پاسخ می دهد. - اگر خطا یک نمونه از AppError نباشد، پاسخ یک errorCode 500 و یک پیام خطای سرور داخلی خواهد بود، زیرا خطای رخ داده در نظر گرفته نشده است.
(middleware/handlError.js)
const AppError = require('../utils/AppError');
const handleError = (err, req, res, next) => {
if (err instanceof AppError) {
return res.status(err.statusCode).json({
message: err.message,
status: err.status
});
}
res.status(500).json({
message: 'Internal Server Error',
status: 500
});
}
module.exports = handleError;
کلاس AppError: یک خطای سفارشی به نام AppError گسترش می دهد new Error(..)
کلاس خطای پایه
- را می پذیرد
message
استدلال وerrorCode
. - متد Super سازنده خطای پایه را با پارامتر پیام اجرا می کند.
(utils/AppError.js)
class AppError extends Error {
constructor(statusCode, message) {
super(message);
this.statusCode = statusCode;
this.status = `${statusCode}`.startsWith("4") ? "fail" : "error";
}
}
module.exports = AppError;
TryCatch Abstraction: انتزاعی به نام tryCatch زمانی که یک کنترلر را به عنوان آرگومان دریافت می کند، میان افزاری را با بلوک try-and-catch ارائه می دهد.
- کنترلر در فراخوانی می شود
try
بلاک کنید و اگر خطایی رخ دهدnext
پارامتر در فراخوانی می شودcatch
با خطای مشخص شده مسدود کنید.
exports.tryCatch = (controller) => async (req, res, next) => {
try {
await controller(req, res, next);
} catch(err) {
next(err);
}
}
ایجاد نقطه پایانی
قبل از اینکه یک نقطه پایانی مدل بسازیم که برای نشان دادن نحوه مدیریت موثر خطاها استفاده می شود. اضافه کنیم handleError
میان افزار به فایل فهرست سرور (app.js)
.
const express = require('express');
const handleError = require('./middleware/handleError');
const app = express();
const PORT = 3000;
app.get("https://dev.to/", (req, res) => {
res.send('Welcome to error handling in Express :)');
});
// error handler middleware
app.use(handleError);
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`)
});
handleError
میان افزار برای رسیدگی به خطاهایی که در طول یک فرآیند HTTP رخ می دهد استفاده می شود.
ایجاد یک روتر اکسپرس نمونه
- یک نقطه پایانی کاربر ایجاد کنید که آرایه ای از کاربران را برمی گرداند. این نقطه پایانی برای آزمایش چندین خطای عملیاتی که در یک فرآیند HTTP قابل رسیدگی است، استفاده خواهد شد.
(routes/user.route.js)
const express = require('express');
const { tryCatch } = require('../utils/tryCatch');
const { getUsers } = require('../service/users.service');
const router = express.Router();
const userController = tryCatch(async (req, res, next) => {
const users = await getUsers();
res.status(200).json(users);
});
router.get('/user', userController);
module.exports = router;
خطاهای نمونه وب سرور
خطای درخواست بد، که اغلب به عنوان 400 شناخته می شود: هنگامی که وب سرور نمی تواند درخواست ارائه شده توسط سرویس گیرنده وب را مدیریت کند، خطای 400 یکی از اشکال وضعیت پاسخ HTTP است که ظاهر می شود. این نوع خطا احتمالاً توسط سرویس گیرنده وب ایجاد می شود. چندین چیز وجود دارد که ممکن است منجر به خطای 400 شود.
- وقتی URL نقطه پایانی حاوی یک اشتباه است
- هنگامی که سرویس گیرنده وب اطلاعات نادرست یا ناقص به وب سرور می دهد.
- یک مشکل مرورگر یا اتصال به اینترنت برای کاربر
نمونه کد
ما می توانیم یک خطای نقطه پایانی نامعتبر را در قسمت مدیریت کنیم app.js
فایل، که نمونه ای از خطای درخواست بد است.
(app.js)
app.get('*', (req, res) => {
throw new AppError(400, 'Invalid endpoint');
});
کاراکتر ستاره در روتر اکسپرس می تواند برای مطابقت با هر تعداد کاراکتر در یک مسیر استفاده شود. برای مثال، مسیر ستاره زمانی فعال می شود که URL مشخص شده با هیچ یک از مسیرهای موجود مطابقت نداشته باشد. در آن نمونه، وب سرور یک کد خطای 400 را برمی گرداند.
خطای غیرمجاز که اغلب به عنوان 401 شناخته می شود: هنگامی که یک سرویس گیرنده وب با یک وب سرور بدون حقوق لازم ارتباط برقرار می کند، وب سرور با خطای 401 پاسخ می دهد که نشان می دهد کاربر مجاز به انجام فعالیت مورد نظر نیست.
نمونه کد
برای نشان دادن خطای 401، اجازه دهید یک میان افزار احراز هویت کاربر بسازیم که بررسی می کند آیا کاربر قبل از تکمیل درخواست کاربر مجاز است یا خیر.
const AppError = require('../utils/AppError');
const authenticated = (req, res, next) => {
const isAuthenticated = req.headers.authorization;
if (!isAuthenticated) {
throw new AppError(401, 'unauthorized request');
}
next();
}
module.exports = authenticated;
سپس میان افزار مجاز در مسیر کاربر استفاده خواهد شد.
(routes/user.route.js)
router.get('/user', authenticated, userController);
اگر پرس و جو کنید /user
endpoint در Postman بدون مجوز، همانطور که در تصویر زیر مشاهده می کنید، خطای 401 را دریافت خواهید کرد.
خطای Not Found که اغلب با نام 404 شناخته می شود: وضعیت پاسخ HTTP 404 زمانی رخ می دهد که سرویس گیرنده وب می تواند با وب سرور تعامل داشته باشد اما وب سرور قادر به یافتن منبع درخواستی نیست. سناریوی زیر را در نظر بگیرید: شما سعی می کنید تی شرت خود را از کمد خود بیاورید و نمی توانید آن را پیدا کنید، اما می توانید وارد کمد خود شوید. امیدوارم مفید بوده باشد XD.
نمونه کد
فرض کنید در حال حاضر هیچ کاربری روی سرور وجود ندارد. وقتی از کاربران درخواست می کنیم، سرور خطای 404 را برمی گرداند. تغییرات ممکن است بر روی کنترلر کاربر انجام شود.
const userController = tryCatch(async (req, res, next) => {
const users = undefined;
if (!users) {
throw new AppError(404, 'No users found')
}
res.status(200).json(users);
});
را اجرا کنید /user
نقطه پایان در پستچی شما
خطای سرور داخلی که اغلب به عنوان 500 شناخته می شود: وضعیت پاسخ 500 نشان دهنده مشکل وب سرور است و ربطی به سرویس گیرنده وب ندارد. عوامل زیر ممکن است در بروز خطای 500 نقش داشته باشند:
- هنگامی که مشکلی با ارائه دهنده میزبان وب سرور ایجاد می شود
- دلیل اتصال ناموفق پایگاه داده
- یک خطای برنامه نویسی در کد وب سرور رخ داده است.
نتیجه
در نهایت، برای به حداکثر رساندن امکان عیب یابی خطاهای عملیاتی خاص که ممکن است هنگام کار بر روی وب سرور رخ دهد، همیشه یک ساختار صحیح رسیدگی به خطا در سرور وب خود داشته باشید. توصیه میکنم این مطلب را بخوانید تا در مورد نحوه مدیریت موثر خطاها در سرور اکسپرس بیشتر بدانید.
به یاد داشته باشید که تحصیلات شما به اینجا ختم نمی شود. ممنون که تا آخر با من همراهی کردی
منابع
-
مستندات Express.js
-
Github Repo