~3 دقیقه مطالعه • بروزرسانی ۵ دی ۱۴۰۴
1. بازنویسی API در Express
Express مجموعهای از متدها و ویژگیها را روی req و res ارائه میدهد. این متدها از طریق prototype به ارث میرسند و همین موضوع امکان بازنویسی یا گسترش آنها را فراهم میکند.
دو نقطهٔ اصلی برای گسترش API وجود دارد:
- سطح جهانی:
express.requestوexpress.response - سطح برنامه:
app.requestوapp.response
تغییرات سطح جهانی روی تمام برنامههای Express در همان پروسه اثر میگذارد. تغییرات سطح برنامه فقط روی همان app اعمال میشود.
2. بازنویسی متدها
میتوان متدهای موجود را با تعریف یک تابع جدید بازنویسی کرد.
مثال: بازنویسی res.sendStatus
app.response.sendStatus = function (statusCode, type, message) {
return this.contentType(type)
.status(statusCode)
.send(message)
}
اکنون این متد سه آرگومان میگیرد:
res.sendStatus(404, 'application/json', '{"error":"resource not found"}')
3. بازنویسی ویژگیها
ویژگیهای Express دو نوع هستند:
- ویژگیهای اختصاص دادهشده (مثل
req.baseUrl) — قابل بازنویسی نیستند. - ویژگیهای getter (مثل
req.ip) — قابل بازنویسی هستند.
مثال: بازنویسی req.ip
Object.defineProperty(app.request, 'ip', {
configurable: true,
enumerable: true,
get () { return this.get('Client-IP') }
})
اکنون مقدار IP از هدر Client-IP خوانده میشود.
4. تغییر Prototype
Express بهصورت پیشفرض از prototypeهای زیر استفاده میکند:
http.IncomingRequest.prototypeبرای reqhttp.ServerResponse.prototypeبرای res
در صورت نیاز میتوان این prototypeها را تغییر داد، اما بهتر است فقط در سطح برنامه انجام شود.
مثال:
Object.setPrototypeOf(Object.getPrototypeOf(app.request), FakeRequest.prototype) Object.setPrototypeOf(Object.getPrototypeOf(app.response), FakeResponse.prototype)
5. استفاده از Template Engine در Express
Template Engineها امکان استفاده از فایلهای قالب و تزریق مقادیر پویا در زمان اجرا را فراهم میکنند.
Express از Template Engineهای مختلفی پشتیبانی میکند:
- Pug (پیشفرض)
- EJS
- Handlebars
- تمام Engineهای پشتیبانیشده توسط @ladjs/consolidate
6. تنظیم Template Engine
در فایل app.js:
app.set('views', './views')
app.set('view engine', 'pug')
نصب Pug:
npm install pug --save
7. ساخت فایل قالب (Pug)
فایل: views/index.pug
html
head
title= title
body
h1= message
8. رندر کردن قالب
app.get('/', (req, res) => {
res.render('index', { title: 'Hey', message: 'Hello there!' })
})
با درخواست به صفحهٔ اصلی، قالب Pug به HTML تبدیل و ارسال میشود.
9. Cache در Template Engine
Cache فقط خود قالب کامپایلشده را ذخیره میکند، نه خروجی HTML را. بنابراین در هر درخواست، قالب دوباره رندر میشود.
10. Debugging در Express
Express از ماژول debug استفاده میکند. برای فعالسازی تمام لاگهای داخلی:
DEBUG=express:* node index.js
در PowerShell:
$env:DEBUG = "express:*"; node index.js
برای لاگهای Router:
DEBUG=express:router node index.js
چند namespace همزمان:
DEBUG=http,mail,express:* node index.js
گزینههای پیشرفته DEBUG
| نام | کاربرد |
|---|---|
| DEBUG | فعال/غیرفعالسازی namespaceها |
| DEBUG_COLORS | فعالسازی رنگها |
| DEBUG_DEPTH | عمق نمایش اشیاء |
| DEBUG_FD | خروجی به فایلدسکریپتور خاص |
| DEBUG_SHOW_HIDDEN | نمایش ویژگیهای مخفی |
11. اجرای Express پشت Reverse Proxy
وقتی Express پشت یک Reverse Proxy اجرا میشود، برخی APIها (مثل req.ip) ممکن است IP پروکسی را نشان دهند. تنظیم trust proxy این رفتار را اصلاح میکند.
مقادیر قابل قبول برای trust proxy:
- Boolean — اعتماد به همه یا هیچ
- IP/Subnet — اعتماد به پروکسیهای مشخص
- Number — تعداد hopهای قابل اعتماد
- Function — منطق سفارشی
مثالها:
app.set('trust proxy', true)
app.set('trust proxy', 'loopback')
app.set('trust proxy', ['loopback', 'uniquelocal'])
app.set('trust proxy', 2)
app.set('trust proxy', ip => ip === '127.0.0.1')
تأثیرات trust proxy:
req.hostnameازX-Forwarded-Hostreq.protocolازX-Forwarded-Protoreq.ipوreq.ipsازX-Forwarded-For
این قابلیت با استفاده از پکیج proxy-addr پیادهسازی شده است.
نتیجهگیری
Express با قابلیت بازنویسی API، پشتیبانی از Template Engineها، ابزارهای Debugging و تنظیمات پیشرفتهٔ Proxy، به یکی از قدرتمندترین ابزارهای ساخت برنامههای وب مدرن تبدیل شده است. تسلط بر این قابلیتها یعنی تسلط بر Express.
نوشته و پژوهش شده توسط دکتر شاهین صیامی