نوشتن Middleware در Express.js: راهنمای کامل برای توسعه‌دهندگان

Middleware در Express.js یکی از مهم‌ترین مفاهیم برای کنترل جریان درخواست‌ها، افزودن قابلیت‌ها، اعتبارسنجی، لاگ‌گیری، مدیریت خطا و ساخت معماری‌های ماژولار است. Middlewareها به سه عنصر اصلی دسترسی دارند: req، res و next. این توابع می‌توانند درخواست را تغییر دهند، پاسخ را ارسال کنند، یا کنترل را به middleware بعدی بسپارند. این مقاله تمام مفاهیم کلیدی Middleware—از ساخت ساده‌ترین نمونه تا Middlewareهای async، مدیریت خطا، و Middlewareهای قابل پیکربندی—را به‌صورت کامل و کاربردی توضیح می‌دهد.

Express Middlewarenext()Request-Response CycleAsync MiddlewareError HandlingConfigurable Middleware

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۵ دی ۱۴۰۴

1. Middleware در Express چیست؟


Middleware تابعی است که به سه چیز دسترسی دارد:

  • req: شیء درخواست
  • res: شیء پاسخ
  • next: تابعی برای انتقال کنترل به middleware بعدی

Middleware می‌تواند:

  • هر نوع کدی اجرا کند
  • req یا res را تغییر دهد
  • چرخهٔ درخواست–پاسخ را خاتمه دهد
  • یا با next() کنترل را منتقل کند

اگر یک middleware چرخهٔ درخواست–پاسخ را پایان ندهد، حتماً باید next() را صدا بزند، در غیر این صورت درخواست معلق می‌ماند.

2. یک مثال ساده


const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(3000)

در ادامه سه middleware به این برنامه اضافه می‌کنیم.

3. Middleware اول: myLogger


این middleware یک پیام ساده در کنسول چاپ می‌کند.

const myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

برای فعال‌سازی:

app.use(myLogger)

نکات مهم:

  • ترتیب بارگذاری middleware اهمیت دارد.
  • اگر بعد از route قرار گیرد، اجرا نمی‌شود.
  • next() کنترل را به middleware بعدی می‌دهد.

4. Middleware دوم: requestTime


این middleware یک ویژگی جدید به req اضافه می‌کند.

const requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

استفاده:

app.use(requestTime)

app.get('/', (req, res) => {
  res.send(`Requested at: ${req.requestTime}`)
})

5. Middleware سوم: validateCookies (Async)


این middleware کوکی‌ها را اعتبارسنجی می‌کند. اگر نامعتبر باشند، خطا ایجاد می‌شود.

async function validateCookies (req, res, next) {
  await cookieValidator(req.cookies)
  next()
}

در Express 5، اگر یک middleware async خطا بدهد، next(error) به‌صورت خودکار فراخوانی می‌شود.

استفاده همراه با cookie-parser:

app.use(cookieParser())
app.use(validateCookies)

app.use((err, req, res, next) => {
  res.status(400).send(err.message)
})

نکتهٔ مهم: اگر چیزی به next() بدهید (به‌جز 'route' یا 'router')، Express آن را خطا تلقی می‌کند.

6. Middlewareهای قابل پیکربندی


برای ساخت middleware قابل تنظیم، یک تابع صادر کنید که options بگیرد و middleware بسازد.

my-middleware.js

module.exports = function (options) {
  return function (req, res, next) {
    // Use options here
    next()
  }
}

استفاده:

const mw = require('./my-middleware')
app.use(mw({ option1: '1', option2: '2' }))

نمونه‌های واقعی: cookie-session، compression

7. نکات کلیدی درباره Middleware


  • Middlewareها به ترتیب تعریف اجرا می‌شوند.
  • اگر next() فراخوانی نشود، درخواست معلق می‌ماند.
  • Middlewareهای async در صورت خطا به‌طور خودکار next(error) را فراخوانی می‌کنند.
  • می‌توان req و res را تغییر داد.
  • می‌توان چرخهٔ درخواست–پاسخ را پایان داد.
  • می‌توان middlewareهای ماژولار و قابل پیکربندی ساخت.

نتیجه‌گیری


Middleware قلب معماری Express است. با استفاده از آن می‌توان لاگ‌گیری، اعتبارسنجی، مدیریت خطا، افزودن ویژگی‌های جدید به req و res، و ساخت ساختارهای ماژولار را به‌سادگی انجام داد. با درک کامل این مفهوم، می‌توان اپلیکیشن‌هایی انعطاف‌پذیر، قابل نگهداری و حرفه‌ای ساخت.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

ادغام دیتابیس با Express.js: راهنمای کامل درایورهای محبوب Node.js

Express.js به‌صورت پیش‌فرض هیچ دیتابیسی را مدیریت نمی‌کند، اما انعطاف‌پذیری آن باعث می‌شود بتوانید تقریباً به هر دیتابیس SQL یا NoSQL متصل شوید. کافی است درایور مناسب Node.js را نصب کرده و از API آن در برنامهٔ Express استفاده کنید. این مقاله نحوهٔ اتصال Express به محبوب‌ترین دیتابیس‌ها را همراه با مثال‌های واقعی توضیح می‌دهد.

ادامه

Express.js پیشرفته: بازنویسی API، استفاده از Template Engine، Debugging

Express.js پیشرفته: بازنویسی API، استفاده از Template Engine، Debugging و کار با Reverse Proxy

ادامه

بازنویسی API در Express و استفاده از Template Engineها

Express.js یک فریم‌ورک مینیمال و انعطاف‌پذیر است که بخش زیادی از قابلیت‌های آن از طریق متدها و ویژگی‌های موجود در request و response ارائه می‌شود. این متدها و ویژگی‌ها از طریق prototype به ارث می‌رسند و همین موضوع امکان بازنویسی (Override) و گسترش (Extend) API را فراهم می‌کند. علاوه بر این، Express از سیستم Template Engine پشتیبانی می‌کند تا بتوان صفحات HTML را به‌صورت پویا تولید کرد. این مقاله هر دو موضوع—بازنویسی API و استفاده از Template Engine—را به‌صورت کامل و کاربردی توضیح می‌دهد.

ادامه

ستفاده از Middleware در Express.js: راهنمای کامل و کاربردی

ستفاده از Middleware در Express.js: راهنمای کامل و کاربردی

ادامه

Routing در Express.js تعیین می‌کند که برنامه چگونه به درخواست‌های

Routing در Express.js تعیین می‌کند که برنامه چگونه به درخواست‌های HTTP در مسیرهای مختلف پاسخ دهد. این سیستم قدرتمند و انعطاف‌پذیر امکان تعریف مسیرهای ساده، الگوهای پیچیده، پارامترهای پویا، چندین هندلر، و ساختارهای ماژولار مبتنی بر Router را فراهم می‌کند. این مقاله تمام مفاهیم کلیدی Routing—از مسیرهای ساده تا Regex، پارامترها، middleware، app.route() و express.Router—را به‌صورت کامل و کاربردی توضیح می‌دهد.

ادامه