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

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

Express MiddlewareApplication-level MiddlewareRouter-level MiddlewareError-handling MiddlewareBuilt-in MiddlewareThird-party Middleware

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

1. Middleware چیست؟


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

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

Middleware می‌تواند:

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

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

2. انواع Middleware در Express


  • Middleware سطح برنامه (Application-level)
  • Middleware سطح Router
  • Middleware مدیریت خطا
  • Middleware داخلی (Built-in)
  • Middleware شخص ثالث (Third-party)

3. Middleware سطح برنامه (Application-level)


3.1 Middleware بدون مسیر

برای هر درخواست اجرا می‌شود:

app.use((req, res, next) => {
  console.log('Time:', Date.now())
  next()
})

3.2 Middleware با مسیر مشخص

app.use('/user/:id', (req, res, next) => {
  console.log('Request Type:', req.method)
  next()
})

3.3 Middleware در مسیر GET

app.get('/user/:id', (req, res) => {
  res.send('USER')
})

3.4 زیرپشتهٔ Middleware

app.use('/user/:id',
  (req, res, next) => {
    console.log('Request URL:', req.originalUrl)
    next()
  },
  (req, res, next) => {
    console.log('Request Type:', req.method)
    next()
  }
)

4. چندین Route برای یک مسیر


app.get('/user/:id', (req, res, next) => {
  console.log('ID:', req.params.id)
  next()
}, (req, res) => {
  res.send('User Info')
})

app.get('/user/:id', (req, res) => {
  res.send(req.params.id)
})

Route دوم هرگز اجرا نمی‌شود، چون Route اول پاسخ را ارسال کرده است.

5. استفاده از next('route')


برای رد کردن بقیهٔ Middlewareهای یک مسیر:

app.get('/user/:id', (req, res, next) => {
  if (req.params.id === '0') next('route')
  else next()
}, (req, res) => {
  res.send('regular')
})

app.get('/user/:id', (req, res) => {
  res.send('special')
})

6. Middleware به‌صورت آرایه


function logOriginalUrl(req, res, next) {
  console.log('Request URL:', req.originalUrl)
  next()
}

function logMethod(req, res, next) {
  console.log('Request Type:', req.method)
  next()
}

const logStuff = [logOriginalUrl, logMethod]

app.get('/user/:id', logStuff, (req, res) => {
  res.send('User Info')
})

7. Middleware سطح Router


مشابه سطح برنامه، اما روی یک Router اعمال می‌شود:

const router = express.Router()

router.use((req, res, next) => {
  console.log('Time:', Date.now())
  next()
})

router.use('/user/:id',
  (req, res, next) => {
    console.log('Request URL:', req.originalUrl)
    next()
  },
  (req, res, next) => {
    console.log('Request Type:', req.method)
    next()
  }
)

router.get('/user/:id', (req, res, next) => {
  if (req.params.id === '0') next('route')
  else next()
}, (req, res) => {
  res.render('regular')
})

router.get('/user/:id', (req, res) => {
  res.render('special')
})

app.use('/', router)

next('router')

برای خروج از Router:

router.use((req, res, next) => {
  if (!req.headers['x-auth']) return next('router')
  next()
})

8. Middleware مدیریت خطا


باید چهار آرگومان داشته باشد:

app.use((err, req, res, next) => {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

9. Middleware داخلی Express


  • express.static: سرو فایل‌های استاتیک
  • express.json: پارس JSON
  • express.urlencoded: پارس فرم‌های URL-encoded

10. Middleware شخص ثالث


مثال: cookie-parser

npm install cookie-parser

const cookieParser = require('cookie-parser')
app.use(cookieParser())

نتیجه‌گیری


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

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