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

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

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.

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

مقالات مرتبط

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

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

ادامه

بازنویسی 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: راهنمای کامل و کاربردی

ادامه

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

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

ادامه

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

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

ادامه