~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.
نوشته و پژوهش شده توسط دکتر شاهین صیامی