~10 دقیقه مطالعه • بروزرسانی ۸ دی ۱۴۰۴
1. معرفی ماژول HTTP
ماژول http از طریق require('node:http') یا import * as http from 'node:http' قابل استفاده است. این ماژول برای مدیریت درخواستها و پاسخهای HTTP در سطح پایین طراحی شده است.
2. مدیریت هدرها
هدرهای HTTP بهصورت یک شیء جاوااسکریپت با کلیدهای lowercase نمایش داده میشوند. نسخهٔ خام هدرها در rawHeaders ذخیره میشود که شامل کلیدها و مقادیر دقیقاً همانطور که دریافت شدهاند است.
3. کلاس http.Agent
http.Agent مسئول مدیریت اتصالها برای کلاینتهای HTTP است. این کلاس اتصالها را نگهداری و بازیافت میکند تا درخواستهای بعدی سریعتر انجام شوند.
- keepAlive: نگهداری اتصالها برای استفادهٔ مجدد.
- maxSockets: حداکثر تعداد اتصالهای همزمان برای هر میزبان.
- maxFreeSockets: تعداد اتصالهای آزاد که میتوان نگه داشت.
- scheduling: انتخاب استراتژی FIFO یا LIFO برای استفاده از سوکتها.
4. مدیریت سوکتها
Agent سوکتها را در صف نگه میدارد و در صورت نیاز مجدداً استفاده میکند. اگر اتصال بسته شود، سوکت از صف حذف میشود. متدهای مهم:
agent.createConnection(): ایجاد سوکت جدید.agent.keepSocketAlive(): نگهداری سوکت برای استفادهٔ مجدد.agent.reuseSocket(): اتصال سوکت به درخواست جدید.agent.destroy(): بستن تمام سوکتهای فعال.
5. گزینههای پیکربندی Agent
هنگام ایجاد Agent میتوان گزینههای متنوعی تنظیم کرد:
keepAliveMsecs: زمان ارسال بستههای TCP Keep-Alive.agentKeepAliveTimeoutBuffer: بافر زمانی برای بستن سوکت قبل از سرور.maxTotalSockets: حداکثر تعداد سوکتها برای همهٔ میزبانها.proxyEnv: پشتیبانی از پراکسی با متغیرهای محیطی.
6. مثال استفاده
const http = require('node:http');
const keepAliveAgent = new http.Agent({ keepAlive: true });
const options = {
hostname: 'localhost',
port: 80,
path: '/',
agent: keepAliveAgent
};
http.request(options, (res) => {
console.log('Response received');
});
نتیجهگیری
ماژول http در Node.js یک ابزار قدرتمند و سطح پایین برای مدیریت ارتباطات HTTP است. با استفادهٔ صحیح از http.Agent و گزینههای پیکربندی آن، میتوان عملکرد شبکه را بهینه کرد و منابع سیستم را بهتر مدیریت نمود.
1. معرفی
شیء http.ClientRequest بهطور داخلی توسط http.request() ساخته میشود. این شیء نمایندهٔ یک درخواست خروجی است که هدرهای آن صفبندی شدهاند و هنوز قابل تغییر هستند.
2. مدیریت هدرها
setHeader(name, value): تنظیم هدر.getHeader(name): دریافت مقدار هدر.removeHeader(name): حذف هدر.getHeaderNames()وgetHeaders(): مشاهدهٔ هدرهای فعلی.getRawHeaderNames(): مشاهدهٔ نام هدرها با همان casing اصلی.
3. رویدادهای مهم
- response: زمانی که پاسخ دریافت شد.
- close: پایان درخواست یا قطع اتصال.
- connect: هنگام دریافت پاسخ CONNECT.
- continue: هنگام دریافت پاسخ 100 Continue.
- finish: پس از ارسال کامل درخواست.
- information: هنگام دریافت پاسخهای 1xx.
- upgrade: هنگام دریافت پاسخ 101 Upgrade.
- timeout: هنگام بیکاری سوکت.
4. متدهای کلیدی
end([data[, encoding]][, callback]): پایان ارسال درخواست.destroy([error]): نابود کردن درخواست و سوکت.flushHeaders(): ارسال فوری هدرها.cork(): بافر کردن دادهها برای نوشتن کارآمدتر.
5. ویژگیها
finished: نشاندهندهٔ پایان درخواست (منسوخ، جایگزین:writableEnded).destroyed: نشاندهندهٔ نابودی درخواست.path: مسیر درخواست.method: متد HTTP.host: میزبان درخواست.protocol: پروتکل درخواست.reusedSocket: آیا سوکت مجدداً استفاده شده است یا خیر.
6. مثال ساده
const http = require('node:http');
const options = {
host: 'example.com',
port: 80,
path: '/',
method: 'GET'
};
const req = http.request(options, (res) => {
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data.');
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
req.end();
نتیجهگیری
کلاس http.ClientRequest ابزار قدرتمندی برای مدیریت درخواستهای خروجی HTTP در Node.js است. با استفاده از رویدادها و متدهای آن، توسعهدهندگان میتوانند کنترل کامل بر چرخهٔ درخواست و پاسخ داشته باشند و ارتباطات شبکهای پایدارتر و کارآمدتری ایجاد کنند.
1. مدیریت هدرها در ClientRequest
setHeader(name, value): تنظیم هدر خروجی.getHeader(name): دریافت مقدار هدر.removeHeader(name): حذف هدر.getHeaderNames()وgetHeaders(): مشاهدهٔ هدرهای فعلی.getRawHeaderNames(): مشاهدهٔ نام هدرها با casing اصلی.
2. ارسال دادهها
write(chunk[, encoding][, callback]): ارسال بخشی از بدنهٔ درخواست.end([data[, encoding]][, callback]): پایان ارسال درخواست.flushHeaders(): ارسال فوری هدرها.
3. مدیریت سوکت
ویژگی request.socket به سوکت زیرین اشاره دارد. این سوکت نمونهای از net.Socket است و اطلاعاتی مانند localAddress و localPort را فراهم میکند.
4. وضعیتهای نوشتن
writableEnded: پس از فراخوانیend()مقدار true میشود.writableFinished: زمانی true میشود که تمام دادهها به سیستم زیرین منتقل شده باشند.
5. رویدادهای ClientRequest
- response: هنگام دریافت پاسخ.
- connect: هنگام پاسخ CONNECT.
- upgrade: هنگام پاسخ Upgrade (مانند WebSocket).
- timeout: هنگام بیکاری سوکت.
- close: پایان درخواست یا قطع اتصال.
6. کلاس http.Server
http.Server از net.Server ارثبری میکند و مسئول مدیریت درخواستهای ورودی است.
7. رویدادهای مهم Server
- request: هنگام دریافت درخواست جدید.
- clientError: هنگام خطای کلاینت.
- connection: هنگام ایجاد اتصال TCP جدید.
- upgrade: هنگام درخواست Upgrade.
- connect: هنگام درخواست CONNECT.
- close: هنگام بسته شدن سرور.
- dropRequest: هنگام رسیدن به محدودیت درخواستها در سوکت.
8. مدیریت بستن سرور
server.close(): توقف پذیرش اتصالهای جدید و بستن اتصالهای موجود.server.closeAllConnections(): بستن همهٔ اتصالها بهطور اجباری.server.closeIdleConnections(): بستن اتصالهای idle مانند keep-alive.
9. مثال ساده
const http = require('node:http');
// ایجاد سرور
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ data: 'Hello World!' }));
});
server.listen(8000);
// ایجاد درخواست
const options = { host: 'localhost', port: 8000, path: '/', method: 'GET' };
const req = http.request(options, (res) => {
res.on('data', (chunk) => console.log(`BODY: ${chunk}`));
});
req.end();
نتیجهگیری
کلاسهای http.ClientRequest و http.Server در Node.js ابزارهای قدرتمندی برای مدیریت چرخهٔ کامل درخواست و پاسخ HTTP هستند. این ترکیب به توسعهدهندگان اجازه میدهد کنترل دقیق بر هدرها، دادهها، سوکتها و رویدادهای کلاینت و سرور داشته باشند.
1. مدیریت زمانبندیها در http.Server
server.requestTimeout: حداکثر زمان برای دریافت کل درخواست از کلاینت (پیشفرض: 300000ms).server.setTimeout(msecs[, callback]): تنظیم زمانبندی سوکتها و مدیریت رویداد timeout.server.timeout: زمان بیکاری سوکتها قبل از قطع اتصال.server.keepAliveTimeout: زمان انتظار برای دادههای جدید پس از پاسخ (پیشفرض: 5 ثانیه).server.keepAliveTimeoutBuffer: بافر اضافی برای کاهش خطاهای ECONNRESET.
2. مدیریت اتصالها
server.maxRequestsPerSocket: حداکثر تعداد درخواستها در هر سوکت قبل از بستن اتصال.server.close(): توقف پذیرش اتصالهای جدید و بستن اتصالهای موجود.server.closeAllConnections(): بستن همهٔ اتصالها بهطور اجباری.server.closeIdleConnections(): بستن اتصالهای idle مانند keep-alive.
3. کلاس http.ServerResponse
این کلاس نمایندهٔ پاسخ سرور است و از http.OutgoingMessage ارثبری میکند. بهطور داخلی توسط سرور ساخته شده و به handler رویداد request پاس داده میشود.
4. مدیریت هدرها در ServerResponse
setHeader(name, value): تنظیم هدر خروجی.getHeader(name): دریافت مقدار هدر.getHeaderNames()وgetHeaders(): مشاهدهٔ هدرهای فعلی.removeHeader(name): حذف هدر.headersSent: بررسی ارسال شدن هدرها.
5. ارسال پاسخ
write(chunk[, encoding][, callback]): ارسال بخشی از بدنهٔ پاسخ.end([data[, encoding]][, callback]): پایان ارسال پاسخ.flushHeaders(): ارسال فوری هدرها.addTrailers(headers): افزودن trailing headers در پاسخهای chunked.
6. وضعیت پاسخ
statusCode: کد وضعیت HTTP (پیشفرض: 200).statusMessage: پیام وضعیت HTTP.strictContentLength: بررسی تطابق دقیق Content-Length با اندازهٔ بدنه.
7. مثال ساده
const http = require('node:http');
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'application/json');
res.statusCode = 200;
res.end(JSON.stringify({ message: 'Hello World!' }));
});
server.listen(8000, () => {
console.log('Server running on port 8000');
});
نتیجهگیری
کلاسهای http.Server و http.ServerResponse در Node.js ابزارهای قدرتمندی برای مدیریت چرخهٔ کامل ارتباطات HTTP هستند. این ترکیب به توسعهدهندگان اجازه میدهد کنترل دقیق بر زمانبندیها، هدرها، بدنهٔ پاسخ و مدیریت اتصالها داشته باشند و سرورهای پایدار و امنتری ایجاد کنند.
1. متدهای ویژه در ServerResponse
response.writeContinue(): ارسال پیام 100 Continue برای اعلام ادامهٔ ارسال بدنهٔ درخواست.response.writeEarlyHints(hints[, callback]): ارسال پیام 103 Early Hints برای preload یا preconnect منابع.response.writeHead(statusCode[, statusMessage][, headers]): ارسال هدرهای پاسخ همراه با کد وضعیت.response.writeProcessing(): ارسال پیام 102 Processing برای اعلام پردازش درخواست.
2. کلاس http.IncomingMessage
این کلاس توسط http.Server یا http.ClientRequest ساخته میشود و نمایندهٔ پیامهای ورودی است. از stream.Readable ارثبری میکند و برای پارس هدرها و payload استفاده میشود.
3. رویدادها و ویژگیهای IncomingMessage
- aborted: رویداد منسوخ برای قطع شدن درخواست.
- close: پایان پیام.
message.aborted: نشاندهندهٔ قطع شدن پیام (منسوخ).message.complete: بررسی کامل بودن پیام قبل از پایان اتصال.message.destroy([error]): نابود کردن سوکت مرتبط.
4. مدیریت هدرها در IncomingMessage
message.headers: هدرهای درخواست/پاسخ با کلیدهای lowercase.message.headersDistinct: نسخهٔ جدید که همیشه آرایهای از رشتهها برمیگرداند.message.rawHeaders: هدرهای خام همانطور که دریافت شدهاند.message.rawTrailers: تریلرهای خام دریافتشده.
5. اطلاعات پروتکل و وضعیت
message.httpVersion: نسخهٔ HTTP (مانند 1.1 یا 1.0).message.method: متد درخواست (GET, POST, DELETE).message.statusCode: کد وضعیت پاسخ (مانند 404).message.statusMessage: پیام وضعیت پاسخ (مانند OK).
6. مدیریت سوکت و زمانبندی
message.socket: شیءnet.Socketمرتبط با اتصال.message.setTimeout(msecs[, callback]): تنظیم timeout برای سوکت.
7. مدیریت تریلرها
message.trailers: هدرهای تریلر پس از پایان پیام.message.trailersDistinct: نسخهٔ جدید که همیشه آرایهای از رشتهها برمیگرداند.
8. مثال ساده
const http = require('node:http');
const server = http.createServer((req, res) => {
res.writeContinue();
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World');
});
server.listen(8000, () => {
console.log('Server running on port 8000');
});
نتیجهگیری
متدهای ویژهٔ ServerResponse و کلاس IncomingMessage در Node.js ابزارهای قدرتمندی برای مدیریت چرخهٔ کامل ارتباطات HTTP هستند. این امکانات به توسعهدهندگان اجازه میدهند کنترل دقیق بر هدرها، وضعیتها، پیامهای خاص و مدیریت سوکتها داشته باشند.
1. ویژگی message.url
ویژگی message.url فقط در درخواستهای دریافتی از http.Server معتبر است و مسیر URL درخواست را نشان میدهد. برای تجزیهٔ آن میتوان از کلاس URL استفاده کرد.
2. کلاس http.OutgoingMessage
این کلاس پایهٔ ClientRequest و ServerResponse است و ابزارهای زیر را فراهم میکند:
addTrailers(headers): افزودن trailing headers در پاسخهای chunked.appendHeader(name, value): افزودن مقدار جدید به یک هدر موجود.setHeader(name, value)وsetHeaders(headers): تنظیم هدرها.getHeader(name)،getHeaderNames()،getHeaders(): مشاهدهٔ هدرها.removeHeader(name): حذف هدر.flushHeaders(): ارسال فوری هدرها.write(chunk[, encoding][, callback]): ارسال بخشی از بدنه.end(chunk[, encoding][, callback]): پایان پیام خروجی.destroy([error]): نابود کردن پیام و سوکت مرتبط.
3. وضعیتهای نوشتن
writableEnded: پس از فراخوانیend()مقدار true میشود.writableFinished: زمانی true میشود که تمام دادهها به سیستم منتقل شده باشند.writableLength: تعداد بایتهای بافر شده.writableHighWaterMark: سطح بافر برای جریان نوشتن.
4. ویژگیهای ماژول HTTP
http.METHODS: لیست متدهای HTTP پشتیبانیشده.http.STATUS_CODES: مجموعهٔ کدهای وضعیت استاندارد HTTP.
5. متدهای مهم HTTP
http.createServer([options][, requestListener]): ایجاد سرور HTTP.http.request(options[, callback]): ارسال درخواست HTTP با کنترل کامل.http.get(options[, callback]): نسخهٔ سادهتر برای درخواستهای GET.
6. مثال ساده
const http = require('node:http');
// ایجاد سرور
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ data: 'Hello World!' }));
});
server.listen(8000);
// ارسال درخواست GET
http.get('http://localhost:8000/', (res) => {
let data = '';
res.on('data', (chunk) => { data += chunk; });
res.on('end', () => { console.log(data); });
});
نتیجهگیری
کلاس http.OutgoingMessage و متدهای ماژول HTTP در Node.js ابزارهای قدرتمندی برای مدیریت ارتباطات HTTP سطح پایین هستند. این امکانات به توسعهدهندگان اجازه میدهند کنترل دقیق بر هدرها، بدنهٔ پیام، سوکتها و چرخهٔ درخواست/پاسخ داشته باشند.
نوشته و پژوهش شده توسط دکتر شاهین صیامی