برنامه نویسی

رسیدگی به خطای سرور 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 نقش داشته باشند:

  • هنگامی که مشکلی با ارائه دهنده میزبان وب سرور ایجاد می شود
  • دلیل اتصال ناموفق پایگاه داده
  • یک خطای برنامه نویسی در کد وب سرور رخ داده است.

نتیجه

در نهایت، برای به حداکثر رساندن امکان عیب یابی خطاهای عملیاتی خاص که ممکن است هنگام کار بر روی وب سرور رخ دهد، همیشه یک ساختار صحیح رسیدگی به خطا در سرور وب خود داشته باشید. توصیه می‌کنم این مطلب را بخوانید تا در مورد نحوه مدیریت موثر خطاها در سرور اکسپرس بیشتر بدانید.
به یاد داشته باشید که تحصیلات شما به اینجا ختم نمی شود. ممنون که تا آخر با من همراهی کردی


منابع

  1. مستندات Express.js

  2. Github Repo

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا