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

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

Express API Overrideexpress.request / express.responseTemplate EnginesDebugging Expresstrust proxyReverse ProxyX-Forwarded-For

~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 برای req
  • http.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-Host
  • req.protocol از X-Forwarded-Proto
  • req.ip و req.ips از X-Forwarded-For

این قابلیت با استفاده از پکیج proxy-addr پیاده‌سازی شده است.

نتیجه‌گیری


Express با قابلیت بازنویسی API، پشتیبانی از Template Engineها، ابزارهای Debugging و تنظیمات پیشرفتهٔ Proxy، به یکی از قدرتمندترین ابزارهای ساخت برنامه‌های وب مدرن تبدیل شده است. تسلط بر این قابلیت‌ها یعنی تسلط بر Express.

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