HTTP
[Stable: 2 - Stable]
Stable: 2 Stability: 2 - مستقر
شفرة المصدر: lib/http.js
يمكن استيراد هذه الوحدة، التي تحتوي على كل من العميل والخادم، عبر require('node:http')
(CommonJS) أو import * as http from 'node:http'
(وحدة ES).
تم تصميم واجهات HTTP في Node.js لدعم العديد من ميزات البروتوكول التي كان من الصعب استخدامها تقليديًا. على وجه الخصوص، الرسائل الكبيرة، وربما المشفرة في شكل قطع. تحرص الواجهة على عدم تخزين الطلبات أو الردود بأكملها مؤقتًا، لذلك يتمكن المستخدم من دفق البيانات.
يتم تمثيل رؤوس رسائل HTTP بواسطة كائن مثل هذا:
{ "content-length": "123",
"content-type": "text/plain",
"connection": "keep-alive",
"host": "example.com",
"accept": "*/*" }
المفاتيح بأحرف صغيرة. القيم لا يتم تعديلها.
من أجل دعم المجموعة الكاملة من تطبيقات HTTP الممكنة، فإن واجهة برمجة تطبيقات HTTP في Node.js منخفضة المستوى للغاية. إنها تتعامل مع معالجة الدفق وتحليل الرسائل فقط. تقوم بتحليل رسالة إلى رؤوس وجسم ولكنها لا تقوم بتحليل الرؤوس الفعلية أو الجسم.
راجع message.headers
للحصول على تفاصيل حول كيفية التعامل مع الرؤوس المكررة.
يتم الاحتفاظ بالرؤوس الأولية كما تم استقبالها في الخاصية rawHeaders
، وهي عبارة عن مصفوفة من [key, value, key2, value2, ...]
. على سبيل المثال، قد يكون لكائن رأس الرسالة السابق قائمة rawHeaders
مثل ما يلي:
[ 'ConTent-Length', '123456',
'content-LENGTH', '123',
'content-type', 'text/plain',
'CONNECTION', 'keep-alive',
'Host', 'example.com',
'accepT', '*/*' ]
الصنف: http.Agent
تمت إضافته في: v0.3.4
Agent
مسؤول عن إدارة استمرارية الاتصال وإعادة استخدامه لعملاء HTTP. يحتفظ بقائمة انتظار للطلبات المعلقة لمضيف ومنفذ معينين، ويعيد استخدام اتصال مأخذ توصيل واحد لكل طلب حتى تصبح قائمة الانتظار فارغة، وفي ذلك الوقت يتم تدمير مأخذ التوصيل أو وضعه في تجمع حيث يتم الاحتفاظ به لاستخدامه مرة أخرى للطلبات إلى نفس المضيف والمنفذ. يعتمد ما إذا كان سيتم تدميره أو تجميعه على الخيار keepAlive
.
يتم تمكين TCP Keep-Alive للاتصالات المجمعة، ولكن قد تظل الخوادم تغلق الاتصالات الخاملة، وفي هذه الحالة ستتم إزالتها من التجمع وسيتم إجراء اتصال جديد عند تقديم طلب HTTP جديد لهذا المضيف والمنفذ. قد ترفض الخوادم أيضًا السماح بطلبات متعددة عبر نفس الاتصال، وفي هذه الحالة سيتعين إعادة إنشاء الاتصال لكل طلب ولا يمكن تجميعه. سيظل Agent
يقدم الطلبات إلى هذا الخادم، ولكن سيحدث كل طلب عبر اتصال جديد.
عندما يتم إغلاق اتصال بواسطة العميل أو الخادم، تتم إزالته من التجمع. سيتم إلغاء إحالة أي مآخذ توصيل غير مستخدمة في التجمع حتى لا تحافظ على تشغيل عملية Node.js عندما لا تكون هناك طلبات معلقة. (انظر socket.unref()
).
من الممارسات الجيدة destroy()
مثيل Agent
عندما لم يعد قيد الاستخدام، لأن مآخذ التوصيل غير المستخدمة تستهلك موارد نظام التشغيل.
تتم إزالة مآخذ التوصيل من وكيل عندما ينبعث مأخذ التوصيل إما حدث 'close'
أو حدث 'agentRemove'
. عند الرغبة في إبقاء طلب HTTP واحد مفتوحًا لفترة طويلة دون الاحتفاظ به في الوكيل، يمكن القيام بشيء مثل ما يلي:
http.get(options, (res) => {
// Do stuff
}).on('socket', (socket) => {
socket.emit('agentRemove');
});
يمكن أيضًا استخدام وكيل لطلب فردي. من خلال توفير {agent: false}
كخيار لوظائف http.get()
أو http.request()
، سيتم استخدام Agent
للاستخدام مرة واحدة مع الخيارات الافتراضية لاتصال العميل.
agent:false
:
http.get({
hostname: 'localhost',
port: 80,
path: '/',
agent: false, // إنشاء وكيل جديد لهذا الطلب فقط
}, (res) => {
// Do stuff with response
});
new Agent([options])
[التاريخ]
الإصدار | التغييرات |
---|---|
v15.6.0, v14.17.0 | تغيير الجدولة الافتراضية من "fifo" إلى "lifo". |
v14.5.0, v12.20.0 | إضافة خيار scheduling لتحديد استراتيجية جدولة المقبس الحر. |
v14.5.0, v12.19.0 | إضافة خيار maxTotalSockets إلى مُنشئ الوكيل. |
v0.3.4 | تمت إضافتها في: v0.3.4 |
options
<الكائن> مجموعة من الخيارات القابلة للتكوين لتعيينها على الوكيل. يمكن أن يحتوي على الحقول التالية:keepAlive
<boolean> الحفاظ على المقابس حتى في حالة عدم وجود طلبات معلقة، بحيث يمكن استخدامها للطلبات المستقبلية دون الحاجة إلى إعادة إنشاء اتصال TCP. يجب عدم الخلط بينه وبين قيمةkeep-alive
لعنوانConnection
. يتم إرسال عنوانConnection: keep-alive
دائمًا عند استخدام وكيل باستثناء الحالات التي يتم فيها تحديد عنوانConnection
بشكل صريح أو عندما يتم تعيين الخيارينkeepAlive
وmaxSockets
علىfalse
وInfinity
على التوالي، وفي هذه الحالة سيتم استخدامConnection: close
. الافتراضي:false
.keepAliveMsecs
<number> عند استخدام الخيارkeepAlive
، يحدد التأخير الأولي لحزم TCP Keep-Alive. يتم تجاهله عندما يكون الخيارkeepAlive
هوfalse
أوundefined
. الافتراضي:1000
.maxSockets
<number> الحد الأقصى لعدد المقابس المسموح به لكل مضيف. إذا فتح نفس المضيف اتصالات متزامنة متعددة، فسيستخدم كل طلب مقبسًا جديدًا حتى يتم الوصول إلى قيمةmaxSockets
. إذا حاول المضيف فتح اتصالات أكثر منmaxSockets
، فستدخل الطلبات الإضافية إلى قائمة انتظار الطلبات المعلقة، وستدخل حالة الاتصال النشط عند إنهاء اتصال موجود. هذا يضمن وجودmaxSockets
على الأكثر من الاتصالات النشطة في أي وقت، من مضيف معين. الافتراضي:Infinity
.maxTotalSockets
<number> الحد الأقصى لعدد المقابس المسموح به لجميع المضيفين إجمالاً. سيستخدم كل طلب مقبسًا جديدًا حتى يتم الوصول إلى الحد الأقصى. الافتراضي:Infinity
.maxFreeSockets
<number> الحد الأقصى لعدد المقابس لكل مضيف لتركها مفتوحة في حالة حرة. ذو صلة فقط إذا تم تعيينkeepAlive
علىtrue
. الافتراضي:256
.scheduling
<string> استراتيجية الجدولة المراد تطبيقها عند اختيار المقبس الحر التالي المراد استخدامه. يمكن أن يكون'fifo'
أو'lifo'
. الفرق الرئيسي بين استراتيجيتي الجدولة هو أن'lifo'
يختار المقبس الأحدث استخدامًا، بينما يختار'fifo'
المقبس الأقل استخدامًا مؤخرًا. في حالة وجود معدل منخفض من الطلبات في الثانية، فإن جدولة'lifo'
ستقلل من خطر اختيار مقبس ربما تم إغلاقه بواسطة الخادم بسبب عدم النشاط. في حالة وجود معدل مرتفع من الطلبات في الثانية، فإن جدولة'fifo'
ستزيد من عدد المقابس المفتوحة، بينما ستحافظ جدولة'lifo'
على الحد الأدنى قدر الإمكان. الافتراضي:'lifo'
.timeout
<number> مهلة المقبس بالمللي ثانية. سيؤدي هذا إلى تعيين المهلة عند إنشاء المقبس.
يتم دعم options
في socket.connect()
أيضًا.
لتكوين أي منها، يجب إنشاء مثيل http.Agent
مخصص.
import { Agent, request } from 'node:http';
const keepAliveAgent = new Agent({ keepAlive: true });
options.agent = keepAliveAgent;
request(options, onResponseCallback);
const http = require('node:http');
const keepAliveAgent = new http.Agent({ keepAlive: true });
options.agent = keepAliveAgent;
http.request(options, onResponseCallback);
agent.createConnection(options[, callback])
تمت إضافتها في: الإصدار v0.11.4
options
<Object> خيارات تحتوي على تفاصيل الاتصال. تحقق منnet.createConnection()
لمعرفة تنسيق الخياراتcallback
<Function> دالة رد نداء تتلقى المقبس الذي تم إنشاؤه- الإرجاع: <stream.Duplex>
ينتج مقبسًا/تيارًا لاستخدامه في طلبات HTTP.
بشكل افتراضي، هذه الدالة هي نفسها net.createConnection()
. ومع ذلك، قد تتجاوز الوكلاء المخصصون هذه الطريقة في حالة الرغبة في مزيد من المرونة.
يمكن توفير مقبس/تيار بإحدى طريقتين: عن طريق إرجاع المقبس/التيار من هذه الدالة، أو عن طريق تمرير المقبس/التيار إلى callback
.
تضمن هذه الطريقة إرجاع نسخة من الفئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، إلا إذا حدد المستخدم نوع مقبس آخر غير <net.Socket>.
callback
لها توقيع (err, stream)
.
agent.keepSocketAlive(socket)
تمت إضافتها في: الإصدار v8.1.0
socket
<stream.Duplex>
يتم استدعاؤها عندما يتم فصل socket
عن طلب ويمكن الاحتفاظ به بواسطة Agent
. السلوك الافتراضي هو:
socket.setKeepAlive(true, this.keepAliveMsecs);
socket.unref();
return true;
يمكن تجاوز هذه الطريقة بواسطة فئة فرعية معينة من Agent
. إذا أرجعت هذه الطريقة قيمة خاطئة، فسيتم تدمير المقبس بدلاً من الاحتفاظ به للاستخدام مع الطلب التالي.
يمكن أن تكون وسيطة socket
نسخة من <net.Socket>، وهي فئة فرعية من <stream.Duplex>.
agent.reuseSocket(socket, request)
تمت إضافتها في: الإصدار v8.1.0
socket
<stream.Duplex>request
<http.ClientRequest>
يتم استدعاؤها عندما يتم إرفاق socket
بـ request
بعد الاحتفاظ به بسبب خيارات keep-alive. السلوك الافتراضي هو:
socket.ref();
يمكن تجاوز هذه الطريقة بواسطة فئة فرعية معينة من Agent
.
يمكن أن تكون وسيطة socket
نسخة من <net.Socket>، وهي فئة فرعية من <stream.Duplex>.
agent.destroy()
أضيف في: v0.11.4
تدمير أي مقابس قيد الاستخدام حاليًا بواسطة الوكيل.
عادة لا يكون من الضروري القيام بذلك. ومع ذلك، إذا كنت تستخدم وكيلًا مع تمكين keepAlive
، فمن الأفضل إيقاف تشغيل الوكيل بشكل صريح عندما لم تعد هناك حاجة إليه. بخلاف ذلك، قد تظل المقابس مفتوحة لفترة طويلة جدًا قبل أن ينهيها الخادم.
agent.freeSockets
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v16.0.0 | أصبح للخاصية الآن نموذج أولي null . |
v0.11.4 | أضيف في: v0.11.4 |
كائن يحتوي على مصفوفات من المقابس التي تنتظر حاليًا استخدامها بواسطة الوكيل عند تمكين keepAlive
. لا تقم بتعديله.
سيتم تدمير المقابس الموجودة في قائمة freeSockets
تلقائيًا وإزالتها من المصفوفة عند 'timeout'
.
agent.getName([options])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v17.7.0, v16.15.0 | أصبح المعامل options اختياريًا الآن. |
v0.11.4 | أضيف في: v0.11.4 |
احصل على اسم فريد لمجموعة من خيارات الطلب، لتحديد ما إذا كان يمكن إعادة استخدام الاتصال. بالنسبة لوكيل HTTP، فإن هذا يرجع host:port:localAddress
أو host:port:localAddress:family
. بالنسبة لوكيل HTTPS، يتضمن الاسم CA وشهادة ورموز التشفير وخيارات HTTPS/TLS المحددة الأخرى التي تحدد إمكانية إعادة استخدام المقبس.
agent.maxFreeSockets
أضيف في: v0.11.7
افتراضيًا مُعيَّن إلى 256. بالنسبة للوكلاء الذين لديهم keepAlive
مُفعّل، يحدد هذا الحد الأقصى لعدد المقابس التي ستظل مفتوحة في الحالة الحرة.
agent.maxSockets
أضيف في: v0.3.6
افتراضيًا مُعيَّن إلى Infinity
. يحدد عدد المقابس المتزامنة التي يمكن أن يمتلكها الوكيل مفتوحة لكل أصل. الأصل هو القيمة المرجعة من agent.getName()
.
agent.maxTotalSockets
أضيف في: v14.5.0, v12.19.0
افتراضيًا مُعيَّن إلى Infinity
. يحدد عدد المقابس المتزامنة التي يمكن أن يمتلكها الوكيل مفتوحة. على عكس maxSockets
، تنطبق هذه المعلمة على جميع الأصول.
agent.requests
[السجل]
الإصدار | التغييرات |
---|---|
v16.0.0 | الخاصية لديها الآن نموذج أولي null . |
v0.5.9 | أضيف في: v0.5.9 |
كائن يحتوي على قوائم انتظار الطلبات التي لم يتم تعيينها بعد للمقابس. لا تعدل.
agent.sockets
[السجل]
الإصدار | التغييرات |
---|---|
v16.0.0 | الخاصية لديها الآن نموذج أولي null . |
v0.3.6 | أضيف في: v0.3.6 |
كائن يحتوي على صفائف من المقابس المستخدمة حاليًا بواسطة الوكيل. لا تعدل.
الفئة: http.ClientRequest
أضيف في: v0.1.17
- يمتد: <http.OutgoingMessage>
يتم إنشاء هذا الكائن داخليًا وإرجاعه من http.request()
. إنه يمثل طلبًا قيد التقدم تم بالفعل وضع رأسِه في قائمة الانتظار. لا يزال الرأس قابلاً للتغيير باستخدام واجهة برمجة التطبيقات setHeader(name, value)
و getHeader(name)
و removeHeader(name)
. سيتم إرسال الرأس الفعلي مع أول جزء بيانات أو عند استدعاء request.end()
.
للحصول على الاستجابة، أضف مستمعًا لـ 'response'
إلى كائن الطلب. سيتم إصدار 'response'
من كائن الطلب عند استلام رؤوس الاستجابة. يتم تنفيذ الحدث 'response'
بوسيطة واحدة وهي مثيل لـ http.IncomingMessage
.
أثناء الحدث 'response'
، يمكن إضافة مستمعين إلى كائن الاستجابة؛ خاصة للاستماع إلى حدث 'data'
.
إذا لم تتم إضافة معالج 'response'
، فسيتم تجاهل الاستجابة بالكامل. ومع ذلك، إذا تمت إضافة معالج حدث 'response'
، فيجب استهلاك البيانات من كائن الاستجابة، إما عن طريق استدعاء response.read()
متى كان هناك حدث 'readable'
، أو عن طريق إضافة معالج 'data'
، أو عن طريق استدعاء طريقة .resume()
. حتى يتم استهلاك البيانات، لن يتم تشغيل حدث 'end'
. أيضًا، حتى تتم قراءة البيانات، ستستهلك الذاكرة التي يمكن أن تؤدي في النهاية إلى حدوث خطأ "نفاد ذاكرة العملية".
للتوافق مع الإصدارات السابقة، ستصدر res
'error'
فقط إذا كان هناك مستمع 'error'
مسجل.
عيّن رأس Content-Length
لتقييد حجم نص الاستجابة. إذا تم تعيين response.strictContentLength
إلى true
، فإن عدم تطابق قيمة رأس Content-Length
سيؤدي إلى ظهور Error
، يتم تحديده بواسطة code:
'ERR_HTTP_CONTENT_LENGTH_MISMATCH'
.
يجب أن تكون قيمة Content-Length
بالبايت، وليس الأحرف. استخدم Buffer.byteLength()
لتحديد طول النص بالبايت.
الحدث: 'abort'
أُضيف في: v1.4.1
تم إهماله منذ: v17.0.0, v16.12.0
[مستقر: 0 - مُهمل]
مستقر: 0 الاستقرار: 0 - مُهمل. استمع إلى الحدث 'close'
بدلاً من ذلك.
يُطلق عندما يتم إجهاض الطلب من قبل العميل. يتم إطلاق هذا الحدث فقط في أول استدعاء لـ abort()
.
الحدث: 'close'
أُضيف في: v0.5.4
يشير إلى أن الطلب قد اكتمل، أو تم إنهاء الاتصال الأساسي له قبل الأوان (قبل اكتمال الاستجابة).
الحدث: 'connect'
أُضيف في: v0.7.0
response
<http.IncomingMessage>socket
<stream.Duplex>head
<Buffer>
يُطلق في كل مرة يستجيب فيها الخادم لطلب بطريقة CONNECT
. إذا لم يتم الاستماع إلى هذا الحدث، فسيتم إغلاق اتصالات العملاء الذين يتلقون طريقة CONNECT
.
يضمن تمرير نسخة من الصنف <net.Socket> لهذا الحدث، وهو صنف فرعي من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس آخر غير <net.Socket>.
زوج من العميل والخادم يوضح كيفية الاستماع إلى الحدث 'connect'
:
import { createServer, request } from 'node:http';
import { connect } from 'node:net';
import { URL } from 'node:url';
// إنشاء وكيل لنفق HTTP
const proxy = createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
proxy.on('connect', (req, clientSocket, head) => {
// الاتصال بخادم المصدر
const { port, hostname } = new URL(`http://${req.url}`);
const serverSocket = connect(port || 80, hostname, () => {
clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
'Proxy-agent: Node.js-Proxy\r\n' +
'\r\n');
serverSocket.write(head);
serverSocket.pipe(clientSocket);
clientSocket.pipe(serverSocket);
});
});
// الآن الوكيل قيد التشغيل
proxy.listen(1337, '127.0.0.1', () => {
// إجراء طلب إلى وكيل نفق
const options = {
port: 1337,
host: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80',
};
const req = request(options);
req.end();
req.on('connect', (res, socket, head) => {
console.log('تم الاتصال!');
// إجراء طلب عبر نفق HTTP
socket.write('GET / HTTP/1.1\r\n' +
'Host: www.google.com:80\r\n' +
'Connection: close\r\n' +
'\r\n');
socket.on('data', (chunk) => {
console.log(chunk.toString());
});
socket.on('end', () => {
proxy.close();
});
});
});
const http = require('node:http');
const net = require('node:net');
const { URL } = require('node:url');
// إنشاء وكيل لنفق HTTP
const proxy = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
proxy.on('connect', (req, clientSocket, head) => {
// الاتصال بخادم المصدر
const { port, hostname } = new URL(`http://${req.url}`);
const serverSocket = net.connect(port || 80, hostname, () => {
clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
'Proxy-agent: Node.js-Proxy\r\n' +
'\r\n');
serverSocket.write(head);
serverSocket.pipe(clientSocket);
clientSocket.pipe(serverSocket);
});
});
// الآن الوكيل قيد التشغيل
proxy.listen(1337, '127.0.0.1', () => {
// إجراء طلب إلى وكيل نفق
const options = {
port: 1337,
host: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80',
};
const req = http.request(options);
req.end();
req.on('connect', (res, socket, head) => {
console.log('تم الاتصال!');
// إجراء طلب عبر نفق HTTP
socket.write('GET / HTTP/1.1\r\n' +
'Host: www.google.com:80\r\n' +
'Connection: close\r\n' +
'\r\n');
socket.on('data', (chunk) => {
console.log(chunk.toString());
});
socket.on('end', () => {
proxy.close();
});
});
});
الحدث: 'continue'
تمت إضافته في: الإصدار 0.3.2
يصدر هذا الحدث عندما يرسل الخادم استجابة HTTP '100 Continue'، وعادةً ما يكون ذلك لأن الطلب يحتوي على 'Expect: 100-continue'. وهذا توجيه بأن العميل يجب أن يرسل نص الطلب.
الحدث: 'finish'
تمت إضافته في: الإصدار 0.3.6
يصدر هذا الحدث عند إرسال الطلب. وبشكل أكثر تحديدًا، يصدر هذا الحدث عندما يتم تسليم الجزء الأخير من رؤوس الاستجابة ونصها إلى نظام التشغيل لإرسالها عبر الشبكة. وهذا لا يعني أن الخادم قد استقبل أي شيء حتى الآن.
الحدث: 'information'
تمت إضافته في: الإصدار 10.0.0
info
<Object>
يصدر هذا الحدث عندما يرسل الخادم استجابة وسيطة 1xx (باستثناء 101 Upgrade). سوف يتلقى المستمعون لهذا الحدث كائنًا يحتوي على إصدار HTTP، ورمز الحالة، ورسالة الحالة، وكائن الرؤوس (المفتاح والقيمة)، ومصفوفة بأسماء الرؤوس الأولية متبوعة بقيمها الخاصة.
import { request } from 'node:http';
const options = {
host: '127.0.0.1',
port: 8080,
path: '/length_request',
};
// Make a request
const req = request(options);
req.end();
req.on('information', (info) => {
console.log(`Got information prior to main response: ${info.statusCode}`);
});
const http = require('node:http');
const options = {
host: '127.0.0.1',
port: 8080,
path: '/length_request',
};
// Make a request
const req = http.request(options);
req.end();
req.on('information', (info) => {
console.log(`Got information prior to main response: ${info.statusCode}`);
});
حالات الترقية 101 لا تطلق هذا الحدث بسبب انقطاعها عن سلسلة طلب/استجابة HTTP التقليدية، مثل مآخذ توصيل الويب أو ترقيات TLS الموضعية أو HTTP 2.0. ليتم إعلامك بإشعارات الترقية 101، استمع إلى الحدث 'upgrade'
بدلاً من ذلك.
الحدث: 'response'
أضيف في: v0.1.0
response
<http.IncomingMessage>
يتم إطلاقه عند استلام استجابة لهذا الطلب. يتم إطلاق هذا الحدث مرة واحدة فقط.
الحدث: 'socket'
أضيف في: v0.5.3
socket
<stream.Duplex>
يضمن تمرير هذا الحدث بمثيل للفئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس آخر غير <net.Socket>.
الحدث: 'timeout'
أضيف في: v0.7.8
يتم إطلاقه عندما تنتهي مهلة المقبس الأساسي بسبب عدم النشاط. هذا يخطر فقط بأن المقبس كان خاملاً. يجب تدمير الطلب يدويًا.
انظر أيضاً: request.setTimeout()
.
الحدث: 'upgrade'
أضيف في: v0.1.94
response
<http.IncomingMessage>socket
<stream.Duplex>head
<Buffer>
يتم إطلاقه في كل مرة يستجيب فيها الخادم لطلب بترقية. إذا لم يتم الاستماع إلى هذا الحدث وكان رمز حالة الاستجابة 101 تبديل البروتوكولات، فسيتم إغلاق اتصالات العملاء الذين يتلقون رأس ترقية.
يضمن تمرير هذا الحدث بمثيل للفئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس آخر غير <net.Socket>.
زوج خادم عميل يوضح كيفية الاستماع إلى الحدث 'upgrade'
.
import http from 'node:http';
import process from 'node:process';
// Create an HTTP server
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
server.on('upgrade', (req, socket, head) => {
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
'Upgrade: WebSocket\r\n' +
'Connection: Upgrade\r\n' +
'\r\n');
socket.pipe(socket); // echo back
});
// Now that server is running
server.listen(1337, '127.0.0.1', () => {
// make a request
const options = {
port: 1337,
host: '127.0.0.1',
headers: {
'Connection': 'Upgrade',
'Upgrade': 'websocket',
},
};
const req = http.request(options);
req.end();
req.on('upgrade', (res, socket, upgradeHead) => {
console.log('got upgraded!');
socket.end();
process.exit(0);
});
});
const http = require('node:http');
// Create an HTTP server
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
server.on('upgrade', (req, socket, head) => {
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
'Upgrade: WebSocket\r\n' +
'Connection: Upgrade\r\n' +
'\r\n');
socket.pipe(socket); // echo back
});
// Now that server is running
server.listen(1337, '127.0.0.1', () => {
// make a request
const options = {
port: 1337,
host: '127.0.0.1',
headers: {
'Connection': 'Upgrade',
'Upgrade': 'websocket',
},
};
const req = http.request(options);
req.end();
req.on('upgrade', (res, socket, upgradeHead) => {
console.log('got upgraded!');
socket.end();
process.exit(0);
});
});
request.abort()
أضيف في: الإصدار 0.3.8
تم الإلغاء منذ: الإصدار 14.1.0، الإصدار 13.14.0
[مستقر: 0 - تم الإلغاء]
مستقر: 0 الاستقرار: 0 - تم الإلغاء: استخدم request.destroy()
بدلاً من ذلك.
يشير إلى أن الطلب في طريقه للإلغاء. استدعاء هذا سيؤدي إلى إسقاط البيانات المتبقية في الاستجابة وتدمير المقبس.
request.aborted
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 17.0.0، الإصدار 16.12.0 | تم الإلغاء منذ: الإصدار 17.0.0، الإصدار 16.12.0 |
الإصدار 11.0.0 | لم يعد الخاصية aborted رقمًا زمنيًا. |
الإصدار 0.11.14 | أضيف في: الإصدار 0.11.14 |
[مستقر: 0 - تم الإلغاء]
مستقر: 0 الاستقرار: 0 - تم الإلغاء. تحقق من request.destroyed
بدلاً من ذلك.
ستكون الخاصية request.aborted
بقيمة true
إذا تم إلغاء الطلب.
request.connection
أضيف في: الإصدار 0.3.0
تم الإلغاء منذ: الإصدار 13.0.0
[مستقر: 0 - تم الإلغاء]
مستقر: 0 الاستقرار: 0 - تم الإلغاء. استخدم request.socket
.
راجع request.socket
.
request.cork()
أضيف في: الإصدار 13.2.0، الإصدار 12.16.0
راجع writable.cork()
.
request.end([data[, encoding]][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 15.0.0 | يمكن أن يكون المعامل data الآن Uint8Array . |
الإصدار 10.0.0 | يعيد هذا الأسلوب الآن مرجعًا إلى ClientRequest . |
الإصدار 0.1.90 | أضيف في: الإصدار 0.1.90 |
data
<string> | <Buffer> | <Uint8Array>encoding
<string>callback
<Function>- الإرجاع: <this>
ينهي إرسال الطلب. إذا كانت هناك أجزاء غير مرسلة من النص الأساسي، فسيتم إرسالها إلى الدفق. إذا كان الطلب مقسمًا إلى أجزاء، فسيرسل '0\r\n\r\n'
النهائية.
إذا تم تحديد data
، فإنه يعادل استدعاء request.write(data, encoding)
متبوعًا بـ request.end(callback)
.
إذا تم تحديد callback
، فسيتم استدعاؤه عند انتهاء دفق الطلب.
request.destroy([error])
[السجل]
الإصدار | التغييرات |
---|---|
v14.5.0 | تُرجع الدالة this للاتساق مع تدفقات القراءة الأخرى (Readable streams). |
v0.3.0 | تمت الإضافة في: v0.3.0 |
تدمير الطلب. بشكل اختياري، إصدار حدث 'error'
وإصدار حدث 'close'
. سيؤدي استدعاء هذا إلى إسقاط البيانات المتبقية في الاستجابة وتدمير المقبس.
انظر writable.destroy()
لمزيد من التفاصيل.
request.destroyed
تمت الإضافة في: v14.1.0, v13.14.0
تكون true
بعد استدعاء request.destroy()
.
انظر writable.destroyed
لمزيد من التفاصيل.
request.finished
تمت الإضافة في: v0.0.1
تم الإيقاف منذ: v13.4.0, v12.16.0
[مستقر: 0 - تم الإيقاف]
مستقر: 0 الاستقرار: 0 - تم الإيقاف. استخدم request.writableEnded
.
ستكون خاصية request.finished
بقيمة true
إذا تم استدعاء request.end()
. سيتم استدعاء request.end()
تلقائيًا إذا تم بدء الطلب عبر http.get()
.
request.flushHeaders()
تمت الإضافة في: v1.6.0
مسح رؤوس الطلب.
لأسباب تتعلق بالكفاءة، يقوم Node.js عادةً بتخزين رؤوس الطلب مؤقتًا حتى يتم استدعاء request.end()
أو كتابة أول جزء من بيانات الطلب. ثم يحاول تجميع رؤوس الطلب والبيانات في حزمة TCP واحدة.
هذا مرغوب فيه عادةً (فهو يوفر رحلة ذهابًا وإيابًا TCP)، ولكن ليس عندما لا يتم إرسال البيانات الأولى حتى وقت لاحق. تتجاوز request.flushHeaders()
التحسين وتبدأ الطلب.
request.getHeader(name)
تمت الإضافة في: الإصدار v1.6.0
يقرأ عنوانًا في الطلب. الاسم غير حساس لحالة الأحرف. يعتمد نوع القيمة المرجعة على الوسائط المقدمة إلى request.setHeader()
.
request.setHeader('content-type', 'text/html');
request.setHeader('Content-Length', Buffer.byteLength(body));
request.setHeader('Cookie', ['type=ninja', 'language=javascript']);
const contentType = request.getHeader('Content-Type');
// 'contentType' is 'text/html'
const contentLength = request.getHeader('Content-Length');
// 'contentLength' is of type number
const cookie = request.getHeader('Cookie');
// 'cookie' is of type string[]
request.getHeaderNames()
تمت الإضافة في: الإصدار v7.7.0
- Returns: <string[]>
إرجاع مصفوفة تحتوي على الأسماء الفريدة للعناوين الصادرة الحالية. جميع أسماء العناوين بأحرف صغيرة.
request.setHeader('Foo', 'bar');
request.setHeader('Cookie', ['foo=bar', 'bar=baz']);
const headerNames = request.getHeaderNames();
// headerNames === ['foo', 'cookie']
request.getHeaders()
تمت الإضافة في: الإصدار v7.7.0
- Returns: <Object>
إرجاع نسخة ضحلة من العناوين الصادرة الحالية. نظرًا لاستخدام نسخة ضحلة ، يمكن تغيير قيم المصفوفة دون إجراء مكالمات إضافية لطرق وحدة http المختلفة المتعلقة بالعنوان. مفاتيح الكائن المرجع هي أسماء الرؤوس والقيم هي قيم الرؤوس المقابلة. جميع أسماء الرؤوس بأحرف صغيرة.
الكائن الذي تم إرجاعه بواسطة طريقة request.getHeaders()
لا يرث بشكل نموذجي من JavaScript Object
. هذا يعني أن طرق Object
النموذجية مثل obj.toString()
و obj.hasOwnProperty()
وغيرها غير محددة و لن تعمل.
request.setHeader('Foo', 'bar');
request.setHeader('Cookie', ['foo=bar', 'bar=baz']);
const headers = request.getHeaders();
// headers === { foo: 'bar', 'cookie': ['foo=bar', 'bar=baz'] }
request.getRawHeaderNames()
أُضيف في: v15.13.0, v14.17.0
- القيمة المعادة: <string[]>
ترجع مصفوفة تحتوي على الأسماء الفريدة للعناوين الأولية الصادرة الحالية. يتم إرجاع أسماء العناوين مع تحديد حالتها الدقيقة.
request.setHeader('Foo', 'bar');
request.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
const headerNames = request.getRawHeaderNames();
// headerNames === ['Foo', 'Set-Cookie']
request.hasHeader(name)
أُضيف في: v7.7.0
ترجع true
إذا تم تعيين العنوان المحدد بواسطة name
حاليًا في العناوين الصادرة. مطابقة اسم العنوان غير حساسة لحالة الأحرف.
const hasContentType = request.hasHeader('content-type');
request.maxHeadersCount
- <number> افتراضي:
2000
يحدد الحد الأقصى لعدد رؤوس الاستجابة. إذا تم تعيينه على 0، فلن يتم تطبيق أي حد.
request.path
أُضيف في: v0.4.0
- <string> مسار الطلب.
request.method
أُضيف في: v0.1.97
- <string> طريقة الطلب.
request.host
أُضيف في: v14.5.0, v12.19.0
- <string> مضيف الطلب.
request.protocol
أُضيف في: v14.5.0, v12.19.0
- <string> بروتوكول الطلب.
request.removeHeader(name)
أُضيف في: v1.6.0
name
<string>
يزيل رأسًا تم تعريفه بالفعل في كائن العناوين.
request.removeHeader('Content-Type');
request.reusedSocket
تمت إضافته في: الإصدار v13.0.0، الإصدار v12.16.0
- <boolean> ما إذا كان الطلب يتم إرساله عبر مقبس معاد استخدامه.
عند إرسال طلب من خلال وكيل مُفعّل بالاحتفاظ بالاتصال، قد يتم إعادة استخدام المقبس الأساسي. ولكن إذا أغلق الخادم الاتصال في وقت غير مناسب، فقد يواجه العميل خطأ "ECONNRESET".
import http from 'node:http';
// يحتوي الخادم على مهلة احتفاظ بالاتصال مدتها 5 ثوانٍ افتراضيًا
http
.createServer((req, res) => {
res.write('hello\n');
res.end();
})
.listen(3000);
setInterval(() => {
// تكييف وكيل الاحتفاظ بالاتصال
http.get('http://localhost:3000', { agent }, (res) => {
res.on('data', (data) => {
// لا تفعل شيئًا
});
});
}, 5000); // إرسال الطلب على فاصل زمني قدره 5 ثوانٍ بحيث يسهل الوصول إلى مهلة الخمول
const http = require('node:http');
// يحتوي الخادم على مهلة احتفاظ بالاتصال مدتها 5 ثوانٍ افتراضيًا
http
.createServer((req, res) => {
res.write('hello\n');
res.end();
})
.listen(3000);
setInterval(() => {
// تكييف وكيل الاحتفاظ بالاتصال
http.get('http://localhost:3000', { agent }, (res) => {
res.on('data', (data) => {
// لا تفعل شيئًا
});
});
}, 5000); // إرسال الطلب على فاصل زمني قدره 5 ثوانٍ بحيث يسهل الوصول إلى مهلة الخمول
من خلال تحديد ما إذا كان الطلب قد أعاد استخدام المقبس أم لا، يمكننا إجراء إعادة محاولة تلقائية للخطأ بناءً عليه.
import http from 'node:http';
const agent = new http.Agent({ keepAlive: true });
function retriableRequest() {
const req = http
.get('http://localhost:3000', { agent }, (res) => {
// ...
})
.on('error', (err) => {
// تحقق مما إذا كانت إعادة المحاولة مطلوبة
if (req.reusedSocket && err.code === 'ECONNRESET') {
retriableRequest();
}
});
}
retriableRequest();
const http = require('node:http');
const agent = new http.Agent({ keepAlive: true });
function retriableRequest() {
const req = http
.get('http://localhost:3000', { agent }, (res) => {
// ...
})
.on('error', (err) => {
// تحقق مما إذا كانت إعادة المحاولة مطلوبة
if (req.reusedSocket && err.code === 'ECONNRESET') {
retriableRequest();
}
});
}
retriableRequest();
request.setHeader(name, value)
تمت الإضافة في: الإصدار v1.6.0
يُعيّن قيمة رأس واحدة لكائن الرؤوس. إذا كان هذا الرأس موجودًا بالفعل في الرؤوس المراد إرسالها، فسيتم استبدال قيمته. استخدم مصفوفة من السلاسل هنا لإرسال رؤوس متعددة بنفس الاسم. سيتم تخزين القيم غير النصية دون تعديل. لذلك، قد تُرجع request.getHeader()
قيمًا غير نصية. ومع ذلك، سيتم تحويل القيم غير النصية إلى سلاسل للإرسال عبر الشبكة.
request.setHeader('Content-Type', 'application/json');
أو
request.setHeader('Cookie', ['type=ninja', 'language=javascript']);
عندما تكون القيمة سلسلة، سيتم طرح استثناء إذا كانت تحتوي على أحرف خارج ترميز latin1
.
إذا كنت بحاجة إلى تمرير أحرف UTF-8 في القيمة، فيرجى ترميز القيمة باستخدام معيار RFC 8187.
const filename = 'Rock 🎵.txt';
request.setHeader('Content-Disposition', `attachment; filename*=utf-8''${encodeURIComponent(filename)}`);
request.setNoDelay([noDelay])
تمت الإضافة في: الإصدار v0.5.9
noDelay
<boolean>
بمجرد تعيين مقبس لهذا الطلب وتوصيله، سيتم استدعاء socket.setNoDelay()
.
request.setSocketKeepAlive([enable][, initialDelay])
تمت الإضافة في: الإصدار v0.5.9
بمجرد تعيين مقبس لهذا الطلب وتوصيله، سيتم استدعاء socket.setKeepAlive()
.
request.setTimeout(timeout[, callback])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v9.0.0 | تم تعيين مهلة المقبس باستمرار فقط عند اتصال المقبس. |
v0.5.9 | تمت الإضافة في: v0.5.9 |
timeout
<number> بالملي ثانية قبل انتهاء مهلة الطلب.callback
<Function> دالة اختيارية يتم استدعاؤها عند حدوث مهلة. نفس الربط بحدث'timeout'
.- الإرجاع: <http.ClientRequest>
بمجرد تعيين مقبس لهذا الطلب واتصاله، سيتم استدعاء socket.setTimeout()
.
request.socket
تمت الإضافة في: v0.3.0
مرجع إلى المقبس الأساسي. عادةً لا يرغب المستخدمون في الوصول إلى هذه الخاصية. على وجه الخصوص، لن يصدر المقبس أحداث 'readable'
بسبب كيفية إرفاق محلل البروتوكول بالمقبس.
import http from 'node:http';
const options = {
host: 'www.google.com',
};
const req = http.get(options);
req.end();
req.once('response', (res) => {
const ip = req.socket.localAddress;
const port = req.socket.localPort;
console.log(`Your IP address is ${ip} and your source port is ${port}.`);
// Consume response object
});
const http = require('node:http');
const options = {
host: 'www.google.com',
};
const req = http.get(options);
req.end();
req.once('response', (res) => {
const ip = req.socket.localAddress;
const port = req.socket.localPort;
console.log(`Your IP address is ${ip} and your source port is ${port}.`);
// Consume response object
});
يضمن أن تكون هذه الخاصية مثيلاً للفئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس آخر غير <net.Socket>.
request.uncork()
أُضيف في: v13.2.0, v12.16.0
راجع writable.uncork()
.
request.writableEnded
أُضيف في: v12.9.0
تكون القيمة true
بعد استدعاء request.end()
. لا يشير هذا الخاصية إلى ما إذا كان قد تم تفريغ البيانات أم لا، ولاستخدام هذا، استخدم request.writableFinished
بدلاً من ذلك.
request.writableFinished
أُضيف في: v12.7.0
تكون القيمة true
إذا تم تفريغ جميع البيانات إلى النظام الأساسي، قبل إصدار الحدث 'finish'
مباشرةً.
request.write(chunk[, encoding][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن يكون المعامل chunk الآن Uint8Array . |
v0.1.29 | أُضيف في: v0.1.29 |
chunk
<string> | <Buffer> | <Uint8Array>encoding
<string>callback
<Function>- الإرجاع: <boolean>
يرسل جزءًا من النص الأساسي. يمكن استدعاء هذه الطريقة عدة مرات. إذا لم يتم تعيين Content-Length
، فسيتم ترميز البيانات تلقائيًا في ترميز نقل HTTP Chunked، بحيث يعرف الخادم متى تنتهي البيانات. تتم إضافة الرأس Transfer-Encoding: chunked
. استدعاء request.end()
ضروري لإنهاء إرسال الطلب.
المعامل encoding
اختياري وينطبق فقط عندما يكون chunk
سلسلة نصية. القيمة الافتراضية هي 'utf8'
.
المعامل callback
اختياري وسيتم استدعاؤه عند تفريغ هذا الجزء من البيانات، ولكن فقط إذا كان الجزء غير فارغ.
إرجاع true
إذا تم تفريغ البيانات بأكملها بنجاح إلى مخزن kernel المؤقت. إرجاع false
إذا تم وضع كل أو جزء من البيانات في قائمة الانتظار في ذاكرة المستخدم. سيتم إصدار 'drain'
عندما يكون المخزن المؤقت خاليًا مرة أخرى.
عند استدعاء الدالة write
بسلسلة نصية أو مخزن مؤقت فارغ، فإنها لا تفعل شيئًا وتنتظر المزيد من الإدخال.
الصنف: http.Server
أُضيف في: الإصدار 0.1.17
- يمتد من: <net.Server>
الحدث: 'checkContinue'
أُضيف في: الإصدار 0.3.0
request
<http.IncomingMessage>response
<http.ServerResponse>
يُطلق في كل مرة يتم فيها استقبال طلب مع Expect: 100-continue
في HTTP. إذا لم يتم الاستماع إلى هذا الحدث، فسيستجيب الخادم تلقائيًا بـ 100 Continue
كما هو مناسب.
تتضمن معالجة هذا الحدث استدعاء response.writeContinue()
إذا كان يجب على العميل الاستمرار في إرسال نص الطلب، أو إنشاء استجابة HTTP مناسبة (مثل 400 Bad Request) إذا كان لا ينبغي للعميل الاستمرار في إرسال نص الطلب.
عندما يتم إطلاق هذا الحدث ومعالجته، لن يتم إطلاق الحدث 'request'
.
الحدث: 'checkExpectation'
أُضيف في: الإصدار 5.5.0
request
<http.IncomingMessage>response
<http.ServerResponse>
يُطلق في كل مرة يتم فيها استقبال طلب مع رأس Expect
في HTTP، حيث القيمة ليست 100-continue
. إذا لم يتم الاستماع إلى هذا الحدث، فسيستجيب الخادم تلقائيًا بـ 417 Expectation Failed
كما هو مناسب.
عندما يتم إطلاق هذا الحدث ومعالجته، لن يتم إطلاق الحدث 'request'
.
الحدث: 'clientError'
[السجل]
الإصدار | التغييرات |
---|---|
v12.0.0 | سيعيد السلوك الافتراضي 431 Request Header Fields Too Large إذا حدث خطأ HPE_HEADER_OVERFLOW. |
v9.4.0 | rawPacket هو المخزن المؤقت الحالي الذي تم تحليله للتو. إضافة هذا المخزن المؤقت إلى كائن الخطأ في الحدث 'clientError' يجعل من الممكن للمطورين تسجيل الحزمة المعطوبة. |
v6.0.0 | لن يتم اتخاذ الإجراء الافتراضي المتمثل في استدعاء .destroy() على socket إذا كانت هناك مستمعين مرفقين بـ 'clientError' . |
v0.1.94 | أُضيف في: الإصدار 0.1.94 |
exception
<Error>socket
<stream.Duplex>
إذا أطلق اتصال عميل حدث 'error'
، فسيتم إعادة توجيهه إلى هنا. يكون المستمع لهذا الحدث مسؤولاً عن إغلاق/تدمير المقبس الأساسي. على سبيل المثال، قد يرغب المرء في إغلاق المقبس بشكل أكثر سلاسة مع استجابة HTTP مخصصة بدلاً من قطع الاتصال فجأة. يجب إغلاق المقبس أو تدميره قبل أن ينتهي المستمع.
يضمن هذا الحدث تمرير نسخة من الصنف <net.Socket>، وهو صنف فرعي من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس آخر غير <net.Socket>.
السلوك الافتراضي هو محاولة إغلاق المقبس باستجابة HTTP '400 Bad Request'، أو استجابة HTTP '431 Request Header Fields Too Large' في حالة خطأ HPE_HEADER_OVERFLOW
. إذا كان المقبس غير قابل للكتابة أو تم إرسال رؤوس http.ServerResponse
المرفقة الحالية، فسيتم تدميره على الفور.
socket
هو كائن net.Socket
الذي نشأ منه الخطأ.
import http from 'node:http';
const server = http.createServer((req, res) => {
res.end();
});
server.on('clientError', (err, socket) => {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);
const http = require('node:http');
const server = http.createServer((req, res) => {
res.end();
});
server.on('clientError', (err, socket) => {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);
عندما يحدث الحدث 'clientError'
، لا يوجد كائن request
أو response
، لذلك يجب كتابة أي استجابة HTTP يتم إرسالها، بما في ذلك رؤوس الاستجابة والحمولة، مباشرةً إلى كائن socket
. يجب توخي الحذر لضمان أن تكون الاستجابة رسالة استجابة HTTP منسقة بشكل صحيح.
err
هو نسخة من Error
مع عمودين إضافيين:
bytesParsed
: عدد البايتات لحزمة الطلب التي ربما قام Node.js بتحليلها بشكل صحيح؛rawPacket
: الحزمة الخام للطلب الحالي.
في بعض الحالات، يكون العميل قد استقبل بالفعل الاستجابة و/أو تم تدمير المقبس بالفعل، كما هو الحال في حالة أخطاء ECONNRESET
. قبل محاولة إرسال بيانات إلى المقبس، من الأفضل التحقق من أنه لا يزال قابلاً للكتابة.
server.on('clientError', (err, socket) => {
if (err.code === 'ECONNRESET' || !socket.writable) {
return;
}
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
الحدث: 'close'
تمت الإضافة في: الإصدار v0.1.4
يتم إطلاقه عند إغلاق الخادم.
الحدث: 'connect'
تمت الإضافة في: الإصدار v0.7.0
request
<http.IncomingMessage> وسائط لطلب HTTP، كما هو الحال في الحدث'request'
socket
<stream.Duplex> مقبس الشبكة بين الخادم والعميلhead
<Buffer> الحزمة الأولى من دفق التوجيه النفقي (قد تكون فارغة)
يتم إطلاقه في كل مرة يطلب فيها عميل طريقة HTTP CONNECT
. إذا لم يتم الاستماع إلى هذا الحدث، فسيتم إغلاق اتصالات العملاء الذين يطلبون طريقة CONNECT
.
يضمن تمرير مثيل من الفئة <net.Socket> إلى هذا الحدث، وهي فئة فرعية من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس بخلاف <net.Socket>.
بعد إطلاق هذا الحدث، لن يحتوي مقبس الطلب على مستمع حدث 'data'
، مما يعني أنه يجب ربطه للتعامل مع البيانات المرسلة إلى الخادم على هذا المأخذ.
الحدث: 'connection'
تمت الإضافة في: الإصدار v0.1.0
socket
<stream.Duplex>
يتم إطلاق هذا الحدث عند إنشاء دفق TCP جديد. عادةً ما يكون socket
كائنًا من النوع net.Socket
. عادةً لا يرغب المستخدمون في الوصول إلى هذا الحدث. على وجه الخصوص، لن يطلق المأخذ أحداث 'readable'
بسبب كيفية ارتباط محلل البروتوكول بالمأخذ. يمكن أيضًا الوصول إلى socket
في request.socket
.
يمكن أيضًا إطلاق هذا الحدث صراحةً من قبل المستخدمين لإدخال الاتصالات في خادم HTTP. في هذه الحالة، يمكن تمرير أي دفق Duplex
.
إذا تم استدعاء socket.setTimeout()
هنا، فسيتم استبدال المهلة بـ server.keepAliveTimeout
عندما يخدم المأخذ طلبًا (إذا كانت قيمة server.keepAliveTimeout
غير صفرية).
يضمن تمرير مثيل من الفئة <net.Socket> إلى هذا الحدث، وهي فئة فرعية من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس بخلاف <net.Socket>.
الحدث: 'dropRequest'
تمت إضافته في: v18.7.0, v16.17.0
request
<http.IncomingMessage> وسائط طلب HTTP، كما هي في الحدث'request'
socket
<stream.Duplex> مأخذ توصيل الشبكة بين الخادم والعميل
عندما يصل عدد الطلبات على مأخذ توصيل إلى عتبة server.maxRequestsPerSocket
، سيسقط الخادم الطلبات الجديدة ويصدر الحدث 'dropRequest'
بدلاً من ذلك، ثم يرسل الرمز 503
إلى العميل.
الحدث: 'request'
تمت إضافته في: v0.1.0
request
<http.IncomingMessage>response
<http.ServerResponse>
يتم إصداره في كل مرة يكون هناك طلب. قد يكون هناك عدة طلبات لكل اتصال (في حالة اتصالات HTTP Keep-Alive).
الحدث: 'upgrade'
[التاريخ]
الإصدار | التغييرات |
---|---|
v10.0.0 | لم يعد الاستماع إلى هذا الحدث يتسبب في تدمير مأخذ التوصيل إذا أرسل العميل رأس ترقية. |
v0.1.94 | تمت إضافته في: v0.1.94 |
request
<http.IncomingMessage> وسائط طلب HTTP، كما هي في الحدث'request'
socket
<stream.Duplex> مأخذ توصيل الشبكة بين الخادم والعميلhead
<Buffer> الحزمة الأولى من التدفق الذي تمت ترقيته (قد تكون فارغة)
يتم إصداره في كل مرة يطلب فيها العميل ترقية HTTP. الاستماع إلى هذا الحدث اختياري ولا يمكن للعملاء الإصرار على تغيير البروتوكول.
بعد إصدار هذا الحدث، لن يكون لمأخذ التوصيل الخاص بالطلب مستمع حدث 'data'
، مما يعني أنه يجب ربطه للتعامل مع البيانات المرسلة إلى الخادم على مأخذ التوصيل هذا.
يضمن هذا الحدث تمرير مثيل لفئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، ما لم يحدد المستخدم نوع مأخذ توصيل آخر غير <net.Socket>.
server.close([callback])
[السجل]
الإصدار | التغييرات |
---|---|
v19.0.0 | تقوم الطريقة بإغلاق الاتصالات الخاملة قبل الإرجاع. |
v0.1.90 | تمت إضافتها في: v0.1.90 |
callback
<Function>
يمنع الخادم من قبول اتصالات جديدة ويغلق جميع الاتصالات المتصلة بهذا الخادم والتي لا ترسل طلبًا أو تنتظر استجابة. انظر net.Server.close()
.
const http = require('node:http');
const server = http.createServer({ keepAliveTimeout: 60000 }, (req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
// أغلق الخادم بعد 10 ثوانٍ
setTimeout(() => {
server.close(() => {
console.log('تم إغلاق الخادم على المنفذ 8000 بنجاح');
});
}, 10000);
server.closeAllConnections()
تمت إضافتها في: v18.2.0
يغلق جميع اتصالات HTTP(S) المنشأة المتصلة بهذا الخادم، بما في ذلك الاتصالات النشطة المتصلة بهذا الخادم والتي ترسل طلبًا أو تنتظر استجابة. هذا لا يدمر المقابس التي تمت ترقيتها إلى بروتوكول مختلف، مثل WebSocket أو HTTP/2.
const http = require('node:http');
const server = http.createServer({ keepAliveTimeout: 60000 }, (req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
// أغلق الخادم بعد 10 ثوانٍ
setTimeout(() => {
server.close(() => {
console.log('تم إغلاق الخادم على المنفذ 8000 بنجاح');
});
// يغلق جميع الاتصالات، مما يضمن إغلاق الخادم بنجاح
server.closeAllConnections();
}, 10000);
server.closeIdleConnections()
تمت إضافتها في: v18.2.0
يغلق جميع الاتصالات المتصلة بهذا الخادم والتي لا ترسل طلبًا أو تنتظر استجابة.
const http = require('node:http');
const server = http.createServer({ keepAliveTimeout: 60000 }, (req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
// أغلق الخادم بعد 10 ثوانٍ
setTimeout(() => {
server.close(() => {
console.log('تم إغلاق الخادم على المنفذ 8000 بنجاح');
});
// يغلق الاتصالات الخاملة، مثل اتصالات keep-alive. سيغلق الخادم
// بمجرد انتهاء الاتصالات النشطة المتبقية
server.closeIdleConnections();
}, 10000);
server.headersTimeout
[السجل]
الإصدار | التغييرات |
---|---|
v19.4.0, v18.14.0 | تم الآن تعيين القيمة الافتراضية لتكون الحد الأدنى بين 60000 (60 ثانية) أو requestTimeout . |
v11.3.0, v10.14.0 | تمت إضافته في: v11.3.0, v10.14.0 |
- <number> افتراضي: الحد الأدنى بين
server.requestTimeout
أو60000
.
يحدد مقدار الوقت الذي ينتظره المحلل لاستقبال رؤوس HTTP الكاملة.
إذا انتهت المهلة، يستجيب الخادم بالحالة 408 دون إعادة توجيه الطلب إلى مستمع الطلب ثم يغلق الاتصال.
يجب تعيينه على قيمة غير صفرية (على سبيل المثال، 120 ثانية) للحماية من هجمات رفض الخدمة المحتملة في حالة نشر الخادم دون وكيل عكسي أمامه.
server.listen()
يبدأ خادم HTTP في الاستماع للاتصالات. هذه الطريقة مماثلة لـ server.listen()
من net.Server
.
server.listening
تمت إضافته في: v5.7.0
- <boolean> يشير إلى ما إذا كان الخادم يستمع للاتصالات أم لا.
server.maxHeadersCount
تمت إضافته في: v0.7.0
- <number> افتراضي:
2000
يحدد الحد الأقصى لعدد الرؤوس الواردة. إذا تم تعيينه على 0، فلن يتم تطبيق أي حد.
server.requestTimeout
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | تم تغيير مهلة الطلب الافتراضية من عدم وجود مهلة إلى 300 ثانية (5 دقائق). |
v14.11.0 | تمت إضافته في: v14.11.0 |
- <number> افتراضي:
300000
يحدد قيمة المهلة بالمللي ثانية لاستقبال الطلب بأكمله من العميل.
إذا انتهت المهلة، يستجيب الخادم بالحالة 408 دون إعادة توجيه الطلب إلى مستمع الطلب ثم يغلق الاتصال.
يجب تعيينه على قيمة غير صفرية (على سبيل المثال، 120 ثانية) للحماية من هجمات رفض الخدمة المحتملة في حالة نشر الخادم دون وكيل عكسي أمامه.
server.setTimeout([msecs][, callback])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v13.0.0 | تم تغيير المهلة الافتراضية من 120 ثانية إلى 0 (بدون مهلة). |
v0.9.12 | تمت الإضافة في: v0.9.12 |
msecs
<number> افتراضي: 0 (بدون مهلة)callback
<Function>- Returns: <http.Server>
يضبط قيمة المهلة للمآخذ، ويصدر حدث 'timeout'
على كائن الخادم، ويمرر المأخذ كوسيطة، إذا حدثت مهلة.
إذا كان هناك مستمع حدث 'timeout'
على كائن الخادم، فسيتم استدعاؤه باستخدام المأخذ الذي انتهت مهلته كوسيطة.
بشكل افتراضي، لا يقوم الخادم بإنهاء مهلة المآخذ. ومع ذلك، إذا تم تعيين رد نداء لحدث 'timeout'
الخاص بالخادم، فيجب معالجة المهلات بشكل صريح.
server.maxRequestsPerSocket
تمت الإضافة في: v16.10.0
- <number> الطلبات لكل مأخذ. افتراضي: 0 (بلا حدود)
الحد الأقصى لعدد الطلبات التي يمكن للمأخذ التعامل معها قبل إغلاق اتصال البقاء على قيد الحياة.
ستؤدي القيمة 0
إلى تعطيل الحد.
عند الوصول إلى الحد، سيتم تعيين قيمة رأس Connection
إلى close
، ولكن لن يتم إغلاق الاتصال فعليًا، وستحصل الطلبات اللاحقة المرسلة بعد الوصول إلى الحد على 503 Service Unavailable
كرد.
server.timeout
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v13.0.0 | تم تغيير المهلة الافتراضية من 120 ثانية إلى 0 (بدون مهلة). |
v0.9.12 | تمت الإضافة في: v0.9.12 |
- <number> المهلة بالمللي ثانية. افتراضي: 0 (بدون مهلة)
عدد المللي ثانية من عدم النشاط قبل افتراض انتهاء مهلة المأخذ.
ستؤدي القيمة 0
إلى تعطيل سلوك المهلة على الاتصالات الواردة.
تم إعداد منطق مهلة المأخذ عند الاتصال، لذا فإن تغيير هذه القيمة يؤثر فقط على الاتصالات الجديدة بالخادم، وليس على أي اتصالات موجودة.
server.keepAliveTimeout
تمت الإضافة في: الإصدار v8.0.0
- <number> المهلة بالمللي ثانية. افتراضي:
5000
(5 ثوانٍ).
عدد المللي ثانية من عدم النشاط التي يحتاجها الخادم للانتظار للحصول على بيانات واردة إضافية، بعد الانتهاء من كتابة آخر استجابة، قبل تدمير المقبس. إذا تلقى الخادم بيانات جديدة قبل انتهاء مهلة الإبقاء على قيد الحياة، فسيقوم بإعادة تعيين مهلة عدم النشاط المنتظمة، أي server.timeout
.
ستؤدي القيمة 0
إلى تعطيل سلوك مهلة الإبقاء على قيد الحياة على الاتصالات الواردة. تجعل القيمة 0
خادم HTTP يتصرف بشكل مشابه لإصدارات Node.js قبل الإصدار 8.0.0، والتي لم يكن لديها مهلة إبقاء على قيد الحياة.
يتم إعداد منطق مهلة المقبس عند الاتصال، لذا فإن تغيير هذه القيمة يؤثر فقط على الاتصالات الجديدة بالخادم، وليس على أي اتصالات موجودة.
server[Symbol.asyncDispose]()
تمت الإضافة في: الإصدار v20.4.0
[مستقر: 1 - تجريبي]
مستقر: 1 الاستقرار: 1 - تجريبي
يستدعي server.close()
ويعيد وعدًا يتحقق عند إغلاق الخادم.
الصنف: http.ServerResponse
تمت الإضافة في: الإصدار v0.1.17
- يمتد: <http.OutgoingMessage>
يتم إنشاء هذا الكائن داخليًا بواسطة خادم HTTP، وليس بواسطة المستخدم. يتم تمريره كمعامل ثانٍ إلى الحدث 'request'
.
الحدث: 'close'
تمت الإضافة في: الإصدار v0.6.7
يشير إلى أن الاستجابة قد اكتملت، أو أن الاتصال الأساسي قد انتهى قبل الأوان (قبل اكتمال الاستجابة).
الحدث: 'finish'
تمت الإضافة في: الإصدار v0.3.6
يتم إطلاقه عند إرسال الاستجابة. وبشكل أكثر تحديدًا، يتم إطلاق هذا الحدث عندما يتم تسليم الجزء الأخير من رؤوس الاستجابة والجسم إلى نظام التشغيل للإرسال عبر الشبكة. لا يعني ذلك أن العميل قد تلقى أي شيء بعد.
response.addTrailers(headers)
أضيف في: v0.3.0
headers
<Object>
تضيف هذه الطريقة تذييلات HTTP (رأس ولكن في نهاية الرسالة) إلى الاستجابة.
سيتم إرسال التذييلات فقط إذا تم استخدام ترميز مُجزأ للاستجابة؛ وإذا لم يكن الأمر كذلك (على سبيل المثال، إذا كان الطلب HTTP/1.0)، فسيتم تجاهلها بصمت.
يتطلب HTTP إرسال رأس Trailer
لإرسال التذييلات، مع قائمة بحقول الرأس في قيمتها. على سبيل المثال،
response.writeHead(200, { 'Content-Type': 'text/plain',
'Trailer': 'Content-MD5' });
response.write(fileData);
response.addTrailers({ 'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667' });
response.end();
محاولة تعيين اسم حقل رأس أو قيمة تحتوي على أحرف غير صالحة ستؤدي إلى ظهور TypeError
.
response.connection
أضيف في: v0.3.0
تم إهماله منذ: v13.0.0
[ثابت: 0 - مهمل]
ثابت: 0 الاستقرار: 0 - مهمل. استخدم response.socket
.
انظر response.socket
.
response.cork()
أضيف في: v13.2.0, v12.16.0
انظر writable.cork()
.
response.end([data[, encoding]][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون معلمة data الآن Uint8Array . |
v10.0.0 | تُرجع هذه الطريقة الآن إشارة إلى ServerResponse . |
v0.1.90 | أضيف في: v0.1.90 |
data
<string> | <Buffer> | <Uint8Array>encoding
<string>callback
<Function>- الإرجاع: <this>
تشير هذه الطريقة إلى الخادم أنه تم إرسال جميع رؤوس الاستجابة ونصها؛ يجب أن يعتبر الخادم هذه الرسالة كاملة. يجب استدعاء الطريقة response.end()
في كل استجابة.
إذا تم تحديد data
، فسيكون تأثيرها مشابهًا لاستدعاء response.write(data, encoding)
متبوعًا بـ response.end(callback)
.
إذا تم تحديد callback
، فسيتم استدعاؤها عند انتهاء تدفق الاستجابة.
response.finished
تمت الإضافة في: v0.0.2
تم الإيقاف منذ: v13.4.0, v12.16.0
[مستقر: 0 - تم الإيقاف]
مستقر: 0 الاستقرار: 0 - تم الإيقاف. استخدم response.writableEnded
.
ستكون الخاصية response.finished
بقيمة true
إذا تم استدعاء response.end()
.
response.flushHeaders()
تمت الإضافة في: v1.6.0
يقوم بتفريغ رؤوس الاستجابة. انظر أيضًا: request.flushHeaders()
.
response.getHeader(name)
تمت الإضافة في: v0.4.0
يقرأ رأسًا تم وضعه بالفعل في قائمة الانتظار ولكن لم يتم إرساله إلى العميل. الاسم غير حساس لحالة الأحرف. يعتمد نوع القيمة المرجعة على الوسائط المقدمة إلى response.setHeader()
.
response.setHeader('Content-Type', 'text/html');
response.setHeader('Content-Length', Buffer.byteLength(body));
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
const contentType = response.getHeader('content-type');
// contentType is 'text/html'
const contentLength = response.getHeader('Content-Length');
// contentLength is of type number
const setCookie = response.getHeader('set-cookie');
// setCookie is of type string[]
response.getHeaderNames()
تمت الإضافة في: v7.7.0
- الإرجاع: <string[]>
يُرجع مصفوفة تحتوي على الأسماء الفريدة للرؤوس الصادرة الحالية. جميع أسماء الرؤوس بأحرف صغيرة.
response.setHeader('Foo', 'bar');
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
const headerNames = response.getHeaderNames();
// headerNames === ['foo', 'set-cookie']
response.getHeaders()
تمت الإضافة في: الإصدار v7.7.0
- Returns: <Object>
إرجاع نسخة سطحية من الرؤوس الصادرة الحالية. نظرًا لاستخدام نسخة سطحية، قد تتغير قيم المصفوفة بدون استدعاءات إضافية لطرق وحدة نمطية http المختلفة المتعلقة بالرأس. مفاتيح الكائن الذي تم إرجاعه هي أسماء الرأس والقيم هي قيم الرأس المقابلة. جميع أسماء الرأس بأحرف صغيرة.
الكائن الذي تم إرجاعه بواسطة طريقة response.getHeaders()
لا يرث بشكل أولي من JavaScript Object
. هذا يعني أن طرق Object
النموذجية مثل obj.toString()
و obj.hasOwnProperty()
وغيرها غير محددة و لن تعمل.
response.setHeader('Foo', 'bar');
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
const headers = response.getHeaders();
// headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] }
response.hasHeader(name)
تمت الإضافة في: الإصدار v7.7.0
إرجاع true
إذا تم تعيين الرأس المحدد بواسطة name
حاليًا في الرؤوس الصادرة. مطابقة اسم الرأس غير حساسة لحالة الأحرف.
const hasContentType = response.hasHeader('content-type');
response.headersSent
تمت الإضافة في: الإصدار v0.9.3
قيمة منطقية (للقراءة فقط). صحيح إذا تم إرسال الرؤوس، خطأ خلاف ذلك.
response.removeHeader(name)
تمت الإضافة في: الإصدار v0.4.0
name
<string>
إزالة رأس مكدس للإرسال الضمني.
response.removeHeader('Content-Encoding');
response.req
تمت الإضافة في: الإصدار v15.7.0
مرجع إلى كائن request
HTTP الأصلي.
response.sendDate
تمت إضافتها في: v0.7.5
عندما تكون القيمة true، سيتم تلقائيًا إنشاء رأس التاريخ (Date) وإرساله في الاستجابة إذا لم يكن موجودًا بالفعل في الرؤوس. القيمة الافتراضية هي true.
يجب تعطيل هذا فقط للاختبار؛ يتطلب HTTP رأس التاريخ في الاستجابات.
response.setHeader(name, value)
تمت إضافتها في: v0.4.0
name
<string>value
<any>- الإرجاع: <http.ServerResponse>
يُرجع كائن الاستجابة.
يضبط قيمة رأس واحد للرؤوس الضمنية. إذا كان هذا الرأس موجودًا بالفعل في الرؤوس المراد إرسالها، فسيتم استبدال قيمته. استخدم مصفوفة من السلاسل النصية هنا لإرسال رؤوس متعددة بنفس الاسم. سيتم تخزين القيم غير النصية دون تعديل. لذلك، قد تُرجع response.getHeader()
قيمًا غير نصية. ومع ذلك، سيتم تحويل القيم غير النصية إلى سلاسل نصية للإرسال عبر الشبكة. يتم إرجاع نفس كائن الاستجابة إلى المستدعي، لتمكين تسلسل الاستدعاءات.
response.setHeader('Content-Type', 'text/html');
أو
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
ستؤدي محاولة تعيين اسم أو قيمة حقل رأس يحتوي على أحرف غير صالحة إلى ظهور TypeError
.
عندما يتم تعيين الرؤوس باستخدام response.setHeader()
، فسيتم دمجها مع أي رؤوس تم تمريرها إلى response.writeHead()
، مع إعطاء الأولوية للرؤوس التي تم تمريرها إلى response.writeHead()
.
// تُرجع content-type = text/plain
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/html');
res.setHeader('X-Foo', 'bar');
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('ok');
});
إذا تم استدعاء الطريقة response.writeHead()
ولم يتم استدعاء هذه الطريقة، فستكتب مباشرة قيم الرأس المقدمة على قناة الشبكة دون تخزينها مؤقتًا داخليًا، ولن تسفر response.getHeader()
على الرأس عن النتيجة المتوقعة. إذا كانت تعبئة الرؤوس التدريجية مرغوبة مع إمكانية استرجاعها وتعديلها في المستقبل، فاستخدم response.setHeader()
بدلاً من response.writeHead()
.
response.setTimeout(msecs[, callback])
أضيف في: الإصدار v0.9.12
msecs
<number>callback
<Function>- الإرجاع: <http.ServerResponse>
يُعيِّن قيمة المهلة الزمنية لمقبس (Socket) الاتصال إلى msecs
. إذا تم توفير دالة رد نداء (callback)، فستُضاف كمستمع لحدث 'timeout'
على كائن الاستجابة (response).
إذا لم تتم إضافة أي مستمع لحدث 'timeout'
إلى الطلب أو الاستجابة أو الخادم، فستُتلف مقابس الاتصال عند انتهاء المهلة الزمنية. إذا تم تعيين معالج لأحداث 'timeout'
الخاصة بالطلب أو الاستجابة أو الخادم، فيجب معالجة المقابس التي انتهت مهلتها الزمنية بشكل صريح.
response.socket
أضيف في: الإصدار v0.3.0
مرجع إلى مقبس الاتصال الأساسي. عادةً لا يرغب المستخدمون في الوصول إلى هذه الخاصية. على وجه الخصوص، لن يُصدر مقبس الاتصال أحداث 'readable'
بسبب كيفية إرفاق محلل البروتوكول بمقبس الاتصال. بعد response.end()
، تُعيَّن قيمة الخاصية إلى null
.
import http from 'node:http';
const server = http.createServer((req, res) => {
const ip = res.socket.remoteAddress;
const port = res.socket.remotePort;
res.end(`Your IP address is ${ip} and your source port is ${port}.`);
}).listen(3000);
const http = require('node:http');
const server = http.createServer((req, res) => {
const ip = res.socket.remoteAddress;
const port = res.socket.remotePort;
res.end(`Your IP address is ${ip} and your source port is ${port}.`);
}).listen(3000);
يُضمن أن تكون هذه الخاصية نسخة من الصنف <net.Socket>، وهو صنف فرعي من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس اتصال آخر غير <net.Socket>.
response.statusCode
أضيف في: الإصدار v0.4.0
- <number> القيمة الافتراضية:
200
عند استخدام ترويسات ضمنية (عدم استدعاء response.writeHead()
بشكل صريح)، تتحكم هذه الخاصية في رمز الحالة الذي سيُرسل إلى العميل عند تدفق الترويسات.
response.statusCode = 404;
بعد إرسال ترويسة الاستجابة إلى العميل، تشير هذه الخاصية إلى رمز الحالة الذي أُرسل.
response.statusMessage
تمت الإضافة في: الإصدار v0.11.8
عند استخدام رؤوس ضمنية (عدم استدعاء response.writeHead()
بشكل صريح)، تتحكم هذه الخاصية في رسالة الحالة التي سيتم إرسالها إلى العميل عند تدفق الرؤوس. إذا تركت هذه الخاصية كـ undefined
، فسيتم استخدام الرسالة القياسية لرمز الحالة.
response.statusMessage = 'Not found';
بعد إرسال رأس الاستجابة إلى العميل، تشير هذه الخاصية إلى رسالة الحالة التي تم إرسالها.
response.strictContentLength
تمت الإضافة في: الإصدار v18.10.0، v16.18.0
- <boolean> الافتراضي:
false
إذا تم تعيينها إلى true
، فستتحقق Node.js مما إذا كانت قيمة رأس Content-Length
وحجم النص الأساسي، بالبايت، متساويين. سيؤدي عدم تطابق قيمة رأس Content-Length
إلى ظهور Error
، يتم تحديده بواسطة code:
'ERR_HTTP_CONTENT_LENGTH_MISMATCH'
.
response.uncork()
تمت الإضافة في: الإصدار v13.2.0، v12.16.0
راجع writable.uncork()
.
response.writableEnded
تمت الإضافة في: الإصدار v12.9.0
تكون true
بعد استدعاء response.end()
. لا تشير هذه الخاصية إلى ما إذا كانت البيانات قد تم تدفقها، ولاستخدامها استخدم response.writableFinished
بدلاً من ذلك.
response.writableFinished
تمت الإضافة في: الإصدار v12.7.0
تكون true
إذا تم تدفق جميع البيانات إلى النظام الأساسي، مباشرة قبل انبعاث حدث 'finish'
.
response.write(chunk[, encoding][, callback])
[التاريخ]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن يكون المعامل chunk الآن Uint8Array . |
v0.1.29 | تمت الإضافة في: الإصدار v0.1.29 |
chunk
<string> | <Buffer> | <Uint8Array>encoding
<string> الافتراضي:'utf8'
callback
<Function>- Returns: <boolean>
إذا تم استدعاء هذا الأسلوب ولم يتم استدعاء response.writeHead()
، فسيتحول إلى وضع الرأس الضمني وتدفق الرؤوس الضمنية.
يرسل هذا جزءًا من نص الاستجابة. يمكن استدعاء هذا الأسلوب عدة مرات لتوفير أجزاء متتالية من النص الأساسي.
إذا تم تعيين rejectNonStandardBodyWrites
إلى true في createServer
، فلن يُسمح بالكتابة إلى النص الأساسي عندما لا تدعم طريقة الطلب أو حالة الاستجابة المحتوى. إذا تمت محاولة الكتابة إلى النص الأساسي لطلب HEAD أو كجزء من استجابة 204
أو 304
، فسيتم طرح Error
متزامن برمز ERR_HTTP_BODY_NOT_ALLOWED
.
يمكن أن يكون chunk
سلسلة أو مخزن مؤقت. إذا كانت chunk
عبارة عن سلسلة، تحدد المعلمة الثانية كيفية ترميزها في دفق بايت. سيتم استدعاء callback
عند تدفق هذه المجموعة من البيانات.
هذا هو نص HTTP الخام ولا علاقة له بترميزات النص الأساسي متعدد الأجزاء ذات المستوى الأعلى التي يمكن استخدامها.
في المرة الأولى التي يتم فيها استدعاء response.write()
، سيرسل معلومات الرأس المخزنة مؤقتًا وأول جزء من النص الأساسي إلى العميل. في المرة الثانية التي يتم فيها استدعاء response.write()
، تفترض Node.js أن البيانات سيتم بثها، وترسل البيانات الجديدة بشكل منفصل. وهذا يعني أن الاستجابة يتم تخزينها مؤقتًا حتى الجزء الأول من النص الأساسي.
يُرجع true
إذا تم تدفق البيانات بأكملها بنجاح إلى المخزن المؤقت kernel. يُرجع false
إذا تم وضع كل أو جزء من البيانات في قائمة الانتظار في ذاكرة المستخدم. سيتم إطلاق 'drain'
عندما يكون المخزن المؤقت مجانيًا مرة أخرى.
response.writeContinue()
أُضيف في: الإصدار 0.3.0
يرسل رسالة HTTP/1.1 100 Continue إلى العميل، مما يشير إلى ضرورة إرسال نص الطلب. انظر حدث 'checkContinue'
في Server
.
response.writeEarlyHints(hints[, callback])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 18.11.0 | السماح بتمرير التلميحات ككائن. |
الإصدار 18.11.0 | أُضيف في: الإصدار 18.11.0 |
hints
<Object>callback
<Function>
يرسل رسالة HTTP/1.1 103 Early Hints إلى العميل مع عنوان Link، مما يشير إلى أن وكيل المستخدم يمكنه تحميل/توصيل الموارد المرتبطة مسبقًا. hints
هو كائن يحتوي على قيم الرؤوس التي سيتم إرسالها مع رسالة التلميحات المبكرة. سيتم استدعاء وسيطة callback
الاختيارية عند كتابة رسالة الاستجابة.
مثال
const earlyHintsLink = '</styles.css>; rel=preload; as=style';
response.writeEarlyHints({
'link': earlyHintsLink,
});
const earlyHintsLinks = [
'</styles.css>; rel=preload; as=style',
'</scripts.js>; rel=preload; as=script',
];
response.writeEarlyHints({
'link': earlyHintsLinks,
'x-trace-id': 'id for diagnostics',
});
const earlyHintsCallback = () => console.log('early hints message sent');
response.writeEarlyHints({
'link': earlyHintsLinks,
}, earlyHintsCallback);
response.writeHead(statusCode[, statusMessage][, headers])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 14.14.0 | السماح بتمرير الرؤوس كمصفوفة. |
الإصدار 11.10.0, الإصدار 10.17.0 | إرجاع this من writeHead() للسماح بالربط مع end() . |
الإصدار 5.11.0, الإصدار 4.4.5 | يتم طرح RangeError إذا لم يكن statusCode رقمًا في النطاق [100, 999] . |
الإصدار 0.1.30 | أُضيف في: الإصدار 0.1.30 |
statusCode
<number>statusMessage
<string>headers
<Object> | <Array>- الإرجاع: <http.ServerResponse>
يرسل رأس الاستجابة إلى الطلب. رمز الحالة هو رمز حالة HTTP مكون من 3 أرقام، مثل 404
. الوسيطة الأخيرة، headers
، هي رؤوس الاستجابة. اختياريًا، يمكن إعطاء statusMessage
قابلة للقراءة البشرية كوسيطة ثانية.
قد تكون headers
عبارة عن Array
حيث تكون المفاتيح والقيم في نفس القائمة. إنها ليست قائمة من الصفوف. لذلك، تكون الإزاحات المرقمة بزوجي هي قيم المفاتيح، والإزاحات المرقمة بفردي هي القيم المرتبطة. المصفوفة بنفس تنسيق request.rawHeaders
.
يُرجع مرجعًا إلى ServerResponse
، بحيث يمكن ربط الاستدعاءات.
const body = 'hello world';
response
.writeHead(200, {
'Content-Length': Buffer.byteLength(body),
'Content-Type': 'text/plain',
})
.end(body);
يجب استدعاء هذه الطريقة مرة واحدة فقط على رسالة ويجب استدعاؤها قبل استدعاء response.end()
.
إذا تم استدعاء response.write()
أو response.end()
قبل استدعاء هذا، فسيتم حساب الرؤوس الضمنية/القابلة للتغيير واستدعاء هذه الوظيفة.
عندما يتم تعيين الرؤوس باستخدام response.setHeader()
، سيتم دمجها مع أي رؤوس يتم تمريرها إلى response.writeHead()
، مع إعطاء الأسبقية للرؤوس التي تم تمريرها إلى response.writeHead()
.
إذا تم استدعاء هذه الطريقة ولم يتم استدعاء response.setHeader()
، فستكتب مباشرة قيم الرأس الموردة على قناة الشبكة دون تخزين مؤقت داخليًا، ولن ينتج response.getHeader()
على الرأس النتيجة المتوقعة. إذا كانت التعبئة التدريجية للرؤوس مطلوبة مع الاسترجاع والتعديل المحتملين في المستقبل، فاستخدم response.setHeader()
بدلاً من ذلك.
// يُرجع content-type = text/plain
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/html');
res.setHeader('X-Foo', 'bar');
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('ok');
});
تتم قراءة Content-Length
بالبايت، وليس الأحرف. استخدم Buffer.byteLength()
لتحديد طول النص بالبايت. سيتحقق Node.js مما إذا كان Content-Length
وطول النص الذي تم إرساله متساويين أم لا.
ستؤدي محاولة تعيين اسم أو قيمة حقل رأس يحتوي على أحرف غير صالحة إلى طرح [Error
][].
response.writeProcessing()
تمت الإضافة في: الإصدار 10.0.0
يرسل رسالة معالجة HTTP/1.1 102 إلى العميل، مشيرًا إلى أنه يجب إرسال نص الطلب.
الصنف: http.IncomingMessage
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 15.5.0 | تُرجع قيمة destroyed القيمة true بعد استهلاك البيانات الواردة. |
الإصدار 13.1.0، الإصدار 12.16.0 | تعكس قيمة readableHighWaterMark قيمة المقبس. |
الإصدار 0.1.17 | تمت الإضافة في: الإصدار 0.1.17 |
- يمتد: <stream.Readable>
يتم إنشاء كائن IncomingMessage
بواسطة http.Server
أو http.ClientRequest
ويتم تمريره كوسيطة أولى إلى حدثي 'request'
و 'response'
على التوالي. يمكن استخدامه للوصول إلى حالة الاستجابة والرؤوس والبيانات.
بخلاف قيمة socket
الخاصة به والتي هي فئة فرعية من <stream.Duplex>، فإن IncomingMessage
نفسه يمتد <stream.Readable> ويتم إنشاؤه بشكل منفصل لتحليل وإصدار رؤوس HTTP والحمولة الواردة، حيث يمكن إعادة استخدام المقبس الأساسي عدة مرات في حالة الاحتفاظ بالاتصال حيًا.
الحدث: 'aborted'
تمت الإضافة في: الإصدار 0.3.8
تم الإهمال منذ: الإصدار 17.0.0، الإصدار 16.12.0
[مستقر: 0 - مهمل]
مستقر: 0 الاستقرار: 0 - مهمل. استمع إلى حدث 'close'
بدلاً من ذلك.
يتم إصداره عند إحباط الطلب.
الحدث: 'close'
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 16.0.0 | يتم الآن إصدار حدث الإغلاق عند اكتمال الطلب وليس عند إغلاق المقبس الأساسي. |
الإصدار 0.4.2 | تمت الإضافة في: الإصدار 0.4.2 |
يتم إصداره عند اكتمال الطلب.
message.aborted
تمت الإضافة في: الإصدار 10.1.0
تم الإهمال منذ: الإصدار 17.0.0، الإصدار 16.12.0
[مستقر: 0 - مهمل]
مستقر: 0 الاستقرار: 0 - مهمل. تحقق من message.destroyed
من <stream.Readable>.
ستكون خاصية message.aborted
هي true
إذا تم إحباط الطلب.
message.complete
أُضيف في: v0.3.0
تكون خاصية message.complete
بقيمة true
إذا تم استلام رسالة HTTP كاملة وتحليلها بنجاح.
تُعد هذه الخاصية مفيدة بشكل خاص كوسيلة لتحديد ما إذا كان العميل أو الخادم قد أرسل رسالة بالكامل قبل إنهاء الاتصال:
const req = http.request({
host: '127.0.0.1',
port: 8080,
method: 'POST',
}, (res) => {
res.resume();
res.on('end', () => {
if (!res.complete)
console.error(
'تم إنهاء الاتصال أثناء إرسال الرسالة');
});
});
message.connection
أُضيف في: v0.1.90
تم إهماله منذ: v16.0.0
[مستقر: 0 - مُهمل]
مستقر: 0 الاستقرار: 0 - مُهمل. استخدم message.socket
.
اسم مستعار لـ message.socket
.
message.destroy([error])
[السجل]
الإصدار | التغييرات |
---|---|
v14.5.0, v12.19.0 | تُرجع الدالة this للاتساق مع تدفقات Readable الأخرى. |
v0.3.0 | أُضيف في: v0.3.0 |
يستدعي destroy()
على المقبس الذي استقبل IncomingMessage
. إذا تم توفير error
، فسيتم إطلاق حدث 'error'
على المقبس ويتم تمرير error
كمعامل إلى أي مستمعين على الحدث.
message.headers
[السجل]
الإصدار | التغييرات |
---|---|
v19.5.0, v18.14.0 | يضمن خيار joinDuplicateHeaders في الدالتين http.request() و http.createServer() عدم تجاهل العناوين المكررة، ولكن يتم دمجها بدلاً من ذلك باستخدام فاصلة، وفقًا لقسم RFC 9110 5.3. |
v15.1.0 | يتم الآن حساب message.headers ببطء باستخدام خاصية الوصول على النموذج الأولي ولم يعد قابلاً للتعداد. |
v0.1.5 | أُضيف في: v0.1.5 |
كائن رؤوس الطلب/الاستجابة.
أزواج قيم المفاتيح لأسماء وقيم الرؤوس. أسماء الرؤوس بأحرف صغيرة.
// يطبع شيئًا مثل:
//
// { 'user-agent': 'curl/7.22.0',
// host: '127.0.0.1:8000',
// accept: '*/*' }
console.log(request.headers);
يتم التعامل مع التكرارات في الرؤوس الأولية بالطرق التالية، اعتمادًا على اسم الرأس:
- يتم تجاهل التكرارات من
age
أوauthorization
أوcontent-length
أوcontent-type
أوetag
أوexpires
أوfrom
أوhost
أوif-modified-since
أوif-unmodified-since
أوlast-modified
أوlocation
أوmax-forwards
أوproxy-authorization
أوreferer
أوretry-after
أوserver
أوuser-agent
. للسماح بضم القيم المكررة للرؤوس المذكورة أعلاه، استخدم الخيارjoinDuplicateHeaders
فيhttp.request()
وhttp.createServer()
. راجع قسم RFC 9110 5.3 لمزيد من المعلومات. set-cookie
دائمًا عبارة عن مصفوفة. تتم إضافة التكرارات إلى المصفوفة.- بالنسبة لرؤوس
cookie
المكررة، يتم ضم القيم معًا باستخدام;
. - بالنسبة لجميع الرؤوس الأخرى، يتم ضم القيم معًا باستخدام
,
.
message.headersDistinct
تمت إضافته في: الإصدار v18.3.0، v16.17.0
مشابهة لـ message.headers
، ولكن لا توجد منطق للانضمام والقيم دائمًا عبارة عن مصفوفات من السلاسل، حتى بالنسبة للرؤوس التي تم استلامها مرة واحدة فقط.
// يطبع شيئًا مثل:
//
// { 'user-agent': ['curl/7.22.0'],
// host: ['127.0.0.1:8000'],
// accept: ['*/*'] }
console.log(request.headersDistinct);
message.httpVersion
تمت إضافته في: الإصدار v0.1.1
في حالة طلب الخادم، يكون إصدار HTTP الذي أرسله العميل. في حالة استجابة العميل، يكون إصدار HTTP للخادم المتصل به. من المحتمل أن يكون '1.1'
أو '1.0'
.
أيضًا message.httpVersionMajor
هو العدد الصحيح الأول و message.httpVersionMinor
هو العدد الصحيح الثاني.
message.method
تمت إضافته في: الإصدار v0.1.1
صالح فقط للطلب الذي تم الحصول عليه من http.Server
.
طريقة الطلب كسلسلة. للقراءة فقط. أمثلة: 'GET'
، 'DELETE'
.
message.rawHeaders
تمت إضافته في: الإصدار v0.11.6
قائمة رؤوس الطلب/الاستجابة الأولية تمامًا كما تم استلامها.
المفاتيح والقيم موجودة في نفس القائمة. إنها ليست قائمة من الصفوف. لذلك، فإن الإزاحات ذات الأرقام الزوجية هي قيم المفاتيح، والإزاحات ذات الأرقام الفردية هي القيم المرتبطة.
أسماء الرؤوس ليست بأحرف صغيرة، والتكرارات لم يتم دمجها.
// يطبع شيئًا مثل:
//
// [ 'user-agent',
// 'this is invalid because there can be only one',
// 'User-Agent',
// 'curl/7.22.0',
// 'Host',
// '127.0.0.1:8000',
// 'ACCEPT',
// '*/*' ]
console.log(request.rawHeaders);
message.rawTrailers
تمت إضافته في: الإصدار v0.11.6
مفاتيح وقيم الملحقات الأولية للطلب/الاستجابة تمامًا كما تم استلامها. يتم تعبئتها فقط في حدث 'end'
.
message.setTimeout(msecs[, callback])
تمت الإضافة في: v0.5.9
msecs
<number>callback
<Function>- الإرجاع: <http.IncomingMessage>
يستدعي message.socket.setTimeout(msecs, callback)
.
message.socket
تمت الإضافة في: v0.3.0
كائن net.Socket
المرتبط بالاتصال.
مع دعم HTTPS، استخدم request.socket.getPeerCertificate()
للحصول على تفاصيل مصادقة العميل.
هذه الخاصية مضمونة لتكون نسخة من الفئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، ما لم يحدد المستخدم نوع مقبس آخر غير <net.Socket> أو تم تصفيره داخليًا.
message.statusCode
تمت الإضافة في: v0.1.1
صالح فقط للاستجابة التي تم الحصول عليها من http.ClientRequest
.
رمز حالة استجابة HTTP المكون من 3 أرقام. على سبيل المثال، 404
.
message.statusMessage
تمت الإضافة في: v0.11.10
صالح فقط للاستجابة التي تم الحصول عليها من http.ClientRequest
.
رسالة حالة استجابة HTTP (عبارة السبب). على سبيل المثال، OK
أو Internal Server Error
.
message.trailers
تمت الإضافة في: v0.3.0
كائن المقطورات للطلب/الاستجابة. يتم تعبئته فقط في حدث 'end'
.
message.trailersDistinct
تمت الإضافة في: v18.3.0, v16.17.0
مشابه لـ message.trailers
، ولكن لا يوجد منطق ضم والقيم دائمًا عبارة عن مصفوفات من السلاسل، حتى بالنسبة للرؤوس التي تم استلامها مرة واحدة فقط. يتم تعبئته فقط في حدث 'end'
.
message.url
أُضيف في: v0.1.90
صالح فقط للطلبات التي تم الحصول عليها من http.Server
.
سلسلة عنوان URL للطلب. يحتوي هذا فقط على عنوان URL الموجود في طلب HTTP الفعلي. خذ الطلب التالي:
GET /status?name=ryan HTTP/1.1 Accept: text/plain
لتحليل عنوان URL إلى أجزائه:
```js [ESM]
new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`);
عندما يكون request.url
هو '/status?name=ryan'
و process.env.HOST
غير مُعرَّف:
$ node
> new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`);
URL {
href: 'http://localhost/status?name=ryan',
origin: 'http://localhost',
protocol: 'http:',
username: '',
password: '',
host: 'localhost',
hostname: 'localhost',
port: '',
pathname: '/status',
search: '?name=ryan',
searchParams: URLSearchParams { 'name' => 'ryan' },
hash: ''
}
تأكد من تعيين process.env.HOST
لاسم مضيف الخادم، أو ضع في اعتبارك استبدال هذا الجزء بالكامل. إذا كنت تستخدم req.headers.host
، فتأكد من استخدام التحقق المناسب، حيث قد يحدد العملاء عنوان Host
مخصص.
Class: http.OutgoingMessage
أُضيف في: v0.1.17
- يمتد: <Stream>
تعمل هذه الفئة كفئة أصل لـ http.ClientRequest
و http.ServerResponse
. إنها رسالة صادرة مجردة من منظور المشاركين في معاملة HTTP.
Event: 'drain'
أُضيف في: v0.3.6
يتم إطلاقه عندما تكون ذاكرة التخزين المؤقت للرسالة مجانية مرة أخرى.
Event: 'finish'
أُضيف في: v0.1.17
يتم إطلاقه عند اكتمال الإرسال بنجاح.
Event: 'prefinish'
أُضيف في: v0.11.6
يتم إطلاقه بعد استدعاء outgoingMessage.end()
. عند إطلاق الحدث، تتم معالجة جميع البيانات ولكن ليس بالضرورة مسحها بالكامل.
outgoingMessage.addTrailers(headers)
تمت الإضافة في: v0.3.0
headers
<Object>
يضيف مقطورات HTTP (رؤوس ولكن في نهاية الرسالة) إلى الرسالة.
سيتم إصدار المقطورات فقط إذا تم ترميز الرسالة بشكل مجزأ. إذا لم يكن الأمر كذلك، فسيتم تجاهل المقطورات بصمت.
يتطلب HTTP إرسال رأس Trailer
لإصدار المقطورات، مع قائمة بأسماء حقول الرؤوس في قيمتها، على سبيل المثال.
message.writeHead(200, { 'Content-Type': 'text/plain',
'Trailer': 'Content-MD5' });
message.write(fileData);
message.addTrailers({ 'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667' });
message.end();
ستؤدي محاولة تعيين اسم حقل رأس أو قيمة تحتوي على أحرف غير صالحة إلى طرح TypeError
.
outgoingMessage.appendHeader(name, value)
تمت الإضافة في: v18.3.0, v16.17.0
name
<string> اسم الرأسvalue
<string> | <string[]> قيمة الرأس- Returns: <this>
إلحاق قيمة رأس واحدة بكائن الرأس.
إذا كانت القيمة عبارة عن مصفوفة، فهذا يعادل استدعاء هذا الأسلوب عدة مرات.
إذا لم تكن هناك قيم سابقة للرأس، فهذا يعادل استدعاء outgoingMessage.setHeader(name, value)
.
اعتمادًا على قيمة options.uniqueHeaders
عند إنشاء طلب العميل أو الخادم، سينتهي هذا بإرسال الرأس عدة مرات أو مرة واحدة بقيم مرتبطة باستخدام ;
.
outgoingMessage.connection
تمت الإضافة في: v0.3.0
تم الإيقاف منذ: v15.12.0, v14.17.1
[مستقر: 0 - تم الإيقاف]
مستقر: 0 الاستقرار: 0 - تم الإيقاف: استخدم outgoingMessage.socket
بدلاً من ذلك.
اسم مستعار لـ outgoingMessage.socket
.
outgoingMessage.cork()
أُضيف في: الإصدار v13.2.0, v12.16.0
اطلع على writable.cork()
.
outgoingMessage.destroy([error])
أُضيف في: الإصدار v0.3.0
يدمر الرسالة. بمجرد ارتباط مقبس (socket) بالرسالة وتوصيله، سيتم تدمير هذا المقبس أيضًا.
outgoingMessage.end(chunk[, encoding][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون معلمة chunk الآن Uint8Array . |
v0.11.6 | إضافة وسيط callback . |
v0.1.90 | أُضيف في: الإصدار v0.1.90 |
chunk
<string> | <Buffer> | <Uint8Array>encoding
<string> اختياري، الافتراضي:utf8
callback
<Function> اختياري- يُعيد: <this>
ينهي الرسالة الصادرة. إذا كانت هناك أي أجزاء من النص غير مرسلة، فسيتم إرسالها إلى النظام الأساسي. إذا كانت الرسالة مقسمة إلى أجزاء، فسيتم إرسال الجزء النهائي 0\r\n\r\n
، وإرسال التذييلات (إذا وجدت).
إذا تم تحديد chunk
، فإنه يكافئ استدعاء outgoingMessage.write(chunk, encoding)
، متبوعًا بـ outgoingMessage.end(callback)
.
إذا تم توفير callback
، فسيتم استدعاؤه عند انتهاء الرسالة (ما يعادل مستمع حدث 'finish'
).
outgoingMessage.flushHeaders()
أُضيف في: الإصدار v1.6.0
يقوم بإرسال رؤوس الرسالة.
لكفاءة الأداء، يقوم Node.js عادةً بتخزين رؤوس الرسالة مؤقتًا حتى يتم استدعاء outgoingMessage.end()
أو كتابة الجزء الأول من بيانات الرسالة. ثم يحاول تجميع الرؤوس والبيانات في حزمة TCP واحدة.
عادة ما يكون هذا مرغوبًا (فهو يوفر رحلة ذهابًا وإيابًا TCP)، ولكن ليس عندما لا يتم إرسال البيانات الأولى حتى وقت لاحق. يتجاوز outgoingMessage.flushHeaders()
التحسين ويبدأ الرسالة.
outgoingMessage.getHeader(name)
تمت الإضافة في: v0.4.0
name
<string> اسم الرأس- الإرجاع: <string> | <undefined>
يحصل على قيمة رأس HTTP بالاسم المحدد. إذا لم يتم تعيين هذا الرأس، فستكون القيمة المرجعة undefined
.
outgoingMessage.getHeaderNames()
تمت الإضافة في: v7.7.0
- الإرجاع: <string[]>
إرجاع مصفوفة تحتوي على الأسماء الفريدة للرؤوس الصادرة الحالية. جميع الأسماء بأحرف صغيرة.
outgoingMessage.getHeaders()
تمت الإضافة في: v7.7.0
- الإرجاع: <Object>
إرجاع نسخة سطحية من الرؤوس الصادرة الحالية. نظرًا لاستخدام نسخة سطحية، يمكن تغيير قيم المصفوفة دون إجراء مكالمات إضافية لأساليب وحدة HTTP المختلفة المتعلقة بالرأس. مفاتيح الكائن المرجع هي أسماء الرؤوس والقيم هي قيم الرأس الخاصة بها. جميع أسماء الرؤوس بأحرف صغيرة.
الكائن الذي يتم إرجاعه بواسطة طريقة outgoingMessage.getHeaders()
لا يرث نموذجًا أوليًا من JavaScript Object
. هذا يعني أن طرق Object
النموذجية مثل obj.toString()
و obj.hasOwnProperty()
وغيرها غير محددة ولن تعمل.
outgoingMessage.setHeader('Foo', 'bar');
outgoingMessage.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
const headers = outgoingMessage.getHeaders();
// headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] }
outgoingMessage.hasHeader(name)
تمت الإضافة في: v7.7.0
إرجاع true
إذا كان الرأس المحدد بواسطة name
معينًا حاليًا في الرؤوس الصادرة. اسم الرأس غير حساس لحالة الأحرف.
const hasContentType = outgoingMessage.hasHeader('content-type');
outgoingMessage.headersSent
إضافة في: v0.9.3
للقراءة فقط. true
إذا تم إرسال الرؤوس، وإلا false
.
outgoingMessage.pipe()
إضافة في: v9.0.0
يتجاوز طريقة stream.pipe()
الموروثة من فئة Stream
القديمة وهي الفئة الأصلية لـ http.OutgoingMessage
.
استدعاء هذه الطريقة سيطلق Error
لأن outgoingMessage
هو مجرى للكتابة فقط.
outgoingMessage.removeHeader(name)
إضافة في: v0.4.0
name
<string> اسم الرأس
يزيل رأسًا تم وضعه في قائمة الانتظار للإرسال الضمني.
outgoingMessage.removeHeader('Content-Encoding');
outgoingMessage.setHeader(name, value)
إضافة في: v0.4.0
يضبط قيمة رأس واحدة. إذا كان الرأس موجودًا بالفعل في الرؤوس المراد إرسالها، فسيتم استبدال قيمته. استخدم مصفوفة من السلاسل النصية لإرسال رؤوس متعددة بنفس الاسم.
outgoingMessage.setHeaders(headers)
إضافة في: v19.6.0, v18.15.0
يضبط قيم رؤوس متعددة للرؤوس الضمنية. يجب أن تكون headers
مثيلًا لـ Headers
أو Map
، إذا كان الرأس موجودًا بالفعل في الرؤوس المراد إرسالها، فسيتم استبدال قيمته.
const headers = new Headers({ foo: 'bar' });
outgoingMessage.setHeaders(headers);
أو
const headers = new Map([['foo', 'bar']]);
outgoingMessage.setHeaders(headers);
عندما يتم تعيين الرؤوس باستخدام outgoingMessage.setHeaders()
، سيتم دمجها مع أي رؤوس يتم تمريرها إلى response.writeHead()
، مع إعطاء الأسبقية للرؤوس التي تم تمريرها إلى response.writeHead()
.
// Returns content-type = text/plain
const server = http.createServer((req, res) => {
const headers = new Headers({ 'Content-Type': 'text/html' });
res.setHeaders(headers);
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('ok');
});
outgoingMessage.setTimeout(msesc[, callback])
أُضيف في: v0.9.12
msesc
<number>callback
<Function> دالة اختيارية يتم استدعاؤها عند حدوث مهلة. نفس الربط بحدثtimeout
.- Returns: <this>
بمجرد ربط مقبس بالرسالة وتوصيله، سيتم استدعاء socket.setTimeout()
مع msecs
كمعامل أول.
outgoingMessage.socket
أُضيف في: v0.3.0
إشارة إلى المقبس الأساسي. عادةً، لن يرغب المستخدمون في الوصول إلى هذه الخاصية.
بعد استدعاء outgoingMessage.end()
، ستصبح هذه الخاصية فارغة.
outgoingMessage.uncork()
أُضيف في: v13.2.0, v12.16.0
انظر writable.uncork()
outgoingMessage.writableCorked
أُضيف في: v13.2.0, v12.16.0
عدد مرات استدعاء outgoingMessage.cork()
.
outgoingMessage.writableEnded
أُضيف في: v12.9.0
تكون true
إذا تم استدعاء outgoingMessage.end()
. لا تشير هذه الخاصية إلى ما إذا كانت البيانات قد تم إرسالها أم لا. لهذا الغرض، استخدم message.writableFinished
بدلاً من ذلك.
outgoingMessage.writableFinished
أُضيف في: v12.7.0
تكون true
إذا تم إرسال جميع البيانات إلى النظام الأساسي.
outgoingMessage.writableHighWaterMark
أُضيف في: v12.9.0
highWaterMark
للمقبس الأساسي إذا تم تعيينه. خلاف ذلك، مستوى المخزن المؤقت الافتراضي عندما يبدأ writable.write()
في إرجاع خطأ (16384).
outgoingMessage.writableLength
تمت الإضافة في: v12.9.0
عدد البايتات المخزنة مؤقتًا.
outgoingMessage.writableObjectMode
تمت الإضافة في: v12.9.0
دائمًا false
.
outgoingMessage.write(chunk[, encoding][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن يكون الآن المعامل chunk هو Uint8Array . |
v0.11.6 | تمت إضافة الوسيطة callback . |
v0.1.29 | تمت الإضافة في: v0.1.29 |
chunk
<string> | <Buffer> | <Uint8Array>encoding
<string> افتراضي:utf8
callback
<Function>- إرجاع: <boolean>
يرسل جزءًا من النص الأساسي. يمكن استدعاء هذا الأسلوب عدة مرات.
تكون الوسيطة encoding
ذات صلة فقط عندما يكون chunk
عبارة عن سلسلة نصية. القيمة الافتراضية هي 'utf8'
.
الوسيطة callback
اختيارية وسيتم استدعاؤها عند مسح هذا الجزء من البيانات.
إرجاع true
إذا تم مسح البيانات بأكملها بنجاح إلى مخزن النواة المؤقت. إرجاع false
إذا تم وضع كل أو جزء من البيانات في قائمة الانتظار في ذاكرة المستخدم. سيتم إصدار الحدث 'drain'
عندما يكون المخزن المؤقت خاليًا مرة أخرى.
http.METHODS
تمت الإضافة في: v0.11.8
قائمة بطرق HTTP التي يدعمها المحلل اللغوي.
http.STATUS_CODES
تمت الإضافة في: v0.1.22
مجموعة من جميع رموز حالة استجابة HTTP القياسية، والوصف الموجز لكل منها. على سبيل المثال، http.STATUS_CODES[404] === 'Not Found'
.
http.createServer([options][, requestListener])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v20.1.0, v18.17.0 | خيار highWaterMark مدعوم الآن. |
v18.0.0 | خيارات requestTimeout و headersTimeout و keepAliveTimeout و connectionsCheckingInterval مدعومة الآن. |
v18.0.0 | خيار noDelay الآن قيمته الافتراضية هي true . |
v17.7.0, v16.15.0 | خيارات noDelay و keepAlive و keepAliveInitialDelay مدعومة الآن. |
v13.3.0 | خيار maxHeaderSize مدعوم الآن. |
v13.8.0, v12.15.0, v10.19.0 | خيار insecureHTTPParser مدعوم الآن. |
v9.6.0, v8.12.0 | وسيطة options مدعومة الآن. |
v0.1.13 | تمت الإضافة في: v0.1.13 |
options
<الكائن>connectionsCheckingInterval
: يحدد قيمة الفاصل الزمني بالمللي ثانية للتحقق من طلبات المهلة الزمنية والعناوين في الطلبات غير المكتملة. الافتراضي:30000
.headersTimeout
: يحدد قيمة المهلة الزمنية بالمللي ثانية لتلقي رؤوس HTTP الكاملة من العميل. انظرserver.headersTimeout
لمزيد من المعلومات. الافتراضي:60000
.highWaterMark
<رقم> يتجاوز اختياريًا جميعsocket
s'readableHighWaterMark
وwritableHighWaterMark
. هذا يؤثر على خاصيةhighWaterMark
لكل منIncomingMessage
وServerResponse
. الافتراضي: انظرstream.getDefaultHighWaterMark()
.insecureHTTPParser
<بولياني> إذا تم تعيينه علىtrue
، فسيستخدم محلل HTTP مع تمكين علامات التساهل. يجب تجنب استخدام المحلل غير الآمن. انظر--insecure-http-parser
لمزيد من المعلومات. الافتراضي:false
.IncomingMessage
<http.IncomingMessage> يحدد فئةIncomingMessage
التي سيتم استخدامها. مفيد لتوسيعIncomingMessage
الأصلي. الافتراضي:IncomingMessage
.joinDuplicateHeaders
<بولياني> إذا تم تعيينه علىtrue
، فإن هذا الخيار يسمح بضم قيم خط الحقل لرؤوس متعددة في طلب مع فاصلة (,
) بدلاً من تجاهل التكرارات. لمزيد من المعلومات، راجعmessage.headers
. الافتراضي:false
.keepAlive
<بولياني> إذا تم تعيينه علىtrue
، فإنه يمكّن وظيفة keep-alive على المقبس مباشرة بعد استقبال اتصال وارد جديد، على غرار ما يتم القيام به في [socket.setKeepAlive([enable][, initialDelay])
][socket.setKeepAlive(enable, initialDelay)
]. الافتراضي:false
.keepAliveInitialDelay
<رقم> إذا تم تعيينه على رقم موجب، فإنه يحدد التأخير الأولي قبل إرسال أول مسبار keepalive على مقبس خامل. الافتراضي:0
.keepAliveTimeout
: عدد المللي ثانية من عدم النشاط التي يحتاجها الخادم للانتظار لتلقي بيانات واردة إضافية، بعد الانتهاء من كتابة الاستجابة الأخيرة، قبل تدمير المقبس. انظرserver.keepAliveTimeout
لمزيد من المعلومات. الافتراضي:5000
.maxHeaderSize
<رقم> يتجاوز اختياريًا قيمة--max-http-header-size
للطلبات التي يتلقاها هذا الخادم، أي الطول الأقصى لرؤوس الطلبات بالبايت. الافتراضي: 16384 (16 KiB).noDelay
<بولياني> إذا تم تعيينه علىtrue
، فإنه يعطل استخدام خوارزمية Nagle مباشرة بعد استقبال اتصال وارد جديد. الافتراضي:true
.requestTimeout
: يحدد قيمة المهلة الزمنية بالمللي ثانية لتلقي الطلب بأكمله من العميل. انظرserver.requestTimeout
لمزيد من المعلومات. الافتراضي:300000
.requireHostHeader
<بولياني> إذا تم تعيينه علىtrue
، فإنه يجبر الخادم على الاستجابة برمز الحالة 400 (طلب غير صالح) لأي رسالة طلب HTTP/1.1 تفتقر إلى رأس المضيف (كما هو منصوص عليه في المواصفات). الافتراضي:true
.ServerResponse
<http.ServerResponse> يحدد فئةServerResponse
التي سيتم استخدامها. مفيد لتوسيعServerResponse
الأصلي. الافتراضي:ServerResponse
.uniqueHeaders
<مصفوفة> قائمة برؤوس الاستجابة التي يجب إرسالها مرة واحدة فقط. إذا كانت قيمة الرأس عبارة عن مصفوفة، فسيتم ضم العناصر باستخدام;
.rejectNonStandardBodyWrites
<بولياني> إذا تم تعيينه علىtrue
، فسيتم طرح خطأ عند الكتابة إلى استجابة HTTP ليس لديها نص. الافتراضي:false
.
requestListener
<دالة>المرتجعات: <http.Server>
إرجاع نسخة جديدة من http.Server
.
requestListener
هي دالة تضاف تلقائيًا إلى الحدث 'request'
.
import http from '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 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);
import http from 'node:http';
// إنشاء خادم محلي لتلقي البيانات منه
const server = http.createServer();
// الاستماع إلى حدث الطلب
server.on('request', (request, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
const http = require('node:http');
// إنشاء خادم محلي لتلقي البيانات منه
const server = http.createServer();
// الاستماع إلى حدث الطلب
server.on('request', (request, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
http.get(options[, callback])
http.get(url[, options][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v10.9.0 | يمكن الآن تمرير المعامل url مع كائن options منفصل. |
v7.5.0 | يمكن أن يكون المعامل options كائن URL من WHATWG. |
v0.3.6 | تمت الإضافة في: v0.3.6 |
url
<string> | <URL>options
<Object> يقبل نفسoptions
الموجودة فيhttp.request()
، مع تعيين الطريقة إلى GET افتراضيًا.callback
<Function>- الإرجاع: <http.ClientRequest>
نظرًا لأن معظم الطلبات هي طلبات GET بدون أجسام، فإن Node.js يوفر هذه الطريقة المريحة. الفرق الوحيد بين هذه الطريقة و http.request()
هو أنه يتم تعيين الطريقة إلى GET افتراضيًا ويتم استدعاء req.end()
تلقائيًا. يجب أن يهتم الاستدعاء بتناول بيانات الاستجابة للأسباب المذكورة في قسم http.ClientRequest
.
يتم استدعاء callback
بوسيطة واحدة وهي نسخة من http.IncomingMessage
.
مثال على جلب JSON:
http.get('http://localhost:8000/', (res) => {
const { statusCode } = res;
const contentType = res.headers['content-type'];
let error;
// Any 2xx status code signals a successful response but
// here we're only checking for 200.
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType}`);
}
if (error) {
console.error(error.message);
// Consume response data to free up memory
res.resume();
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
console.log(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
// Create a local server to receive data from
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!',
}));
});
server.listen(8000);
http.globalAgent
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار v19.0.0 | يستخدم الوكيل الآن HTTP Keep-Alive ومهلة 5 ثوانٍ افتراضيًا. |
الإصدار v0.5.9 | تمت إضافته في: v0.5.9 |
نموذج عام من Agent
يستخدم كافتراضي لجميع طلبات عميل HTTP. يختلف عن تكوين Agent
افتراضي من خلال تمكين keepAlive
ووجود timeout
لمدة 5 ثوانٍ.
http.maxHeaderSize
تمت إضافته في: v11.6.0، v10.15.0
خاصية للقراءة فقط تحدد الحد الأقصى المسموح به لحجم رؤوس HTTP بالبايت. القيمة الافتراضية هي 16 كيلوبايت. يمكن تهيئتها باستخدام خيار سطر الأوامر --max-http-header-size
.
يمكن تجاوز هذا للخوادم وطلبات العملاء عن طريق تمرير خيار maxHeaderSize
.
http.request(options[, callback])
http.request(url[, options][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار v16.7.0, v14.18.0 | عند استخدام كائن URL ، سيتم الآن فك ترميز اسم المستخدم وكلمة المرور بشكل صحيح. |
الإصدار v15.3.0, v14.17.0 | من الممكن إلغاء طلب باستخدام AbortSignal. |
الإصدار v13.3.0 | خيار maxHeaderSize مدعوم الآن. |
الإصدار v13.8.0, v12.15.0, v10.19.0 | خيار insecureHTTPParser مدعوم الآن. |
الإصدار v10.9.0 | يمكن الآن تمرير معلمة url مع كائن options منفصل. |
الإصدار v7.5.0 | يمكن أن تكون معلمة options كائن WHATWG URL . |
الإصدار v0.3.6 | تمت إضافته في: v0.3.6 |
options
<Object>agent
<http.Agent> | <boolean> يتحكم في سلوكAgent
. القيم المحتملة:undefined
(افتراضي): استخدمhttp.globalAgent
لهذا المضيف والمنفذ.كائن
Agent
: استخدمAgent
الذي تم تمريره بشكل صريح.false
: يتسبب في استخدامAgent
جديد بقيم افتراضية.auth
<string> مصادقة أساسية ('user:password'
) لحساب رأس التفويض.createConnection
<Function> دالة تنتج مقبسًا/تدفقًا لاستخدامه في الطلب عندما لا يتم استخدام خيارagent
. يمكن استخدام هذا لتجنب إنشاء فئةAgent
مخصصة فقط لتجاوز دالةcreateConnection
الافتراضية. راجعagent.createConnection()
لمزيد من التفاصيل. أي تدفقDuplex
هو قيمة إرجاع صالحة.defaultPort
<number> المنفذ الافتراضي للبروتوكول. الافتراضي:agent.defaultPort
إذا تم استخدامAgent
، وإلاundefined
.family
<number> عائلة عنوان IP لاستخدامها عند حلhost
أوhostname
. القيم الصالحة هي4
أو6
. عند عدم تحديدها، سيتم استخدام كل من IPv4 و IPv6.headers
<Object> كائن يحتوي على رؤوس الطلب.hints
<number> تلميحاتdns.lookup()
اختيارية.host
<string> اسم مجال أو عنوان IP للخادم لإصدار الطلب إليه. الافتراضي:'localhost'
.hostname
<string> اسم مستعار لـhost
. لدعمurl.parse()
، سيتم استخدامhostname
إذا تم تحديد كل منhost
وhostname
.insecureHTTPParser
<boolean> إذا تم تعيينه علىtrue
، فسيستخدم محلل HTTP مع تمكين علامات التساهل. يجب تجنب استخدام المحلل غير الآمن. راجع--insecure-http-parser
لمزيد من المعلومات. الافتراضي:false
joinDuplicateHeaders
<boolean> يربط قيم سطر الحقل لرؤوس متعددة في طلب مع,
بدلاً من تجاهل التكرارات. راجعmessage.headers
لمزيد من المعلومات. الافتراضي:false
.localAddress
<string> الواجهة المحلية للربط لاتصالات الشبكة.localPort
<number> المنفذ المحلي للاتصال منه.lookup
<Function> دالة بحث مخصصة. الافتراضي:dns.lookup()
.maxHeaderSize
<number> يتجاوز اختياريًا قيمة--max-http-header-size
(الحد الأقصى لطول رؤوس الاستجابة بالبايت) للاستجابات الواردة من الخادم. الافتراضي: 16384 (16 كيلوبايت).method
<string> سلسلة تحدد طريقة طلب HTTP. الافتراضي:'GET'
.path
<string> مسار الطلب. يجب أن يتضمن سلسلة الاستعلام إن وجدت. على سبيل المثال'/index.html?page=12'
. يتم طرح استثناء عندما يحتوي مسار الطلب على أحرف غير قانونية. حاليًا، يتم رفض المسافات فقط ولكن قد يتغير ذلك في المستقبل. الافتراضي:'/'
.port
<number> منفذ الخادم البعيد. الافتراضي:defaultPort
إذا تم تعيينه، وإلا80
.protocol
<string> البروتوكول المراد استخدامه. الافتراضي:'http:'
.setDefaultHeaders
<boolean>: يحدد ما إذا كان سيتم إضافة الرؤوس الافتراضية تلقائيًا مثلConnection
وContent-Length
وTransfer-Encoding
وHost
. إذا تم تعيينه علىfalse
، فيجب إضافة جميع الرؤوس الضرورية يدويًا. القيمة الافتراضية هيtrue
.setHost
<boolean>: يحدد ما إذا كان سيتم إضافة رأسHost
تلقائيًا. إذا تم توفيره، فإنه يتجاوزsetDefaultHeaders
. القيمة الافتراضية هيtrue
.signal
<AbortSignal>: AbortSignal يمكن استخدامه لإلغاء طلب قيد التقدم.socketPath
<string> مقبس مجال Unix. لا يمكن استخدامه إذا تم تحديد أحدhost
أوport
، لأن هذه تحدد مقبس TCP.timeout
<number>: رقم يحدد مهلة المقبس بالمللي ثانية. سيؤدي هذا إلى تعيين المهلة قبل توصيل المقبس.uniqueHeaders
<Array> قائمة برؤوس الطلب التي يجب إرسالها مرة واحدة فقط. إذا كانت قيمة الرأس عبارة عن مصفوفة، فسيتم ربط العناصر باستخدام;
.
callback
<Function>الإرجاع: <http.ClientRequest>
يتم دعم options
في socket.connect()
أيضًا.
تحافظ Node.js على عدة اتصالات لكل خادم لتقديم طلبات HTTP. تسمح هذه الوظيفة بإصدار الطلبات بشفافية.
يمكن أن يكون url
سلسلة أو كائن URL
. إذا كان url
سلسلة، فسيتم تحليله تلقائيًا باستخدام new URL()
. إذا كان كائن URL
، فسيتم تحويله تلقائيًا إلى كائن options
عادي.
إذا تم تحديد كل من url
و options
، فسيتم دمج الكائنات، مع أخذ خصائص options
الأسبقية.
ستتم إضافة معلمة callback
الاختيارية كمستمع لمرة واحدة لحدث 'response'
.
ترجع http.request()
نسخة من فئة http.ClientRequest
. نسخة ClientRequest
هي تدفق قابل للكتابة. إذا كان المرء بحاجة إلى تحميل ملف بطلب POST، فاكتب إلى كائن ClientRequest
.
import http from 'node:http';
import { Buffer } from 'node:buffer';
const postData = JSON.stringify({
'msg': 'Hello World!',
});
const options = {
hostname: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(postData),
},
};
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// Write data to request body
req.write(postData);
req.end();
const http = require('node:http');
const postData = JSON.stringify({
'msg': 'Hello World!',
});
const options = {
hostname: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(postData),
},
};
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// Write data to request body
req.write(postData);
req.end();
في المثال تم استدعاء req.end()
. مع http.request()
يجب دائمًا استدعاء req.end()
للدلالة على نهاية الطلب - حتى إذا لم تكن هناك بيانات مكتوبة في نص الطلب.
إذا حدث أي خطأ أثناء الطلب (سواء كان ذلك في حل DNS أو أخطاء مستوى TCP أو أخطاء تحليل HTTP فعلية) فسيتم إرسال حدث 'error'
على كائن الطلب الذي تم إرجاعه. كما هو الحال مع جميع أحداث 'error'
، إذا لم يتم تسجيل أي مستمعين، فسيتم طرح الخطأ.
هناك بعض الرؤوس الخاصة التي يجب ملاحظتها.
- إرسال 'Connection: keep-alive' سيبلغ Node.js بأنه يجب الاحتفاظ بالاتصال بالخادم حتى الطلب التالي.
- إرسال رأس 'Content-Length' سيعطل الترميز المجزأ الافتراضي.
- إرسال رأس 'Expect' سيرسل رؤوس الطلب على الفور. عادةً، عند إرسال 'Expect: 100-continue'، يجب تعيين مهلة ومستمع لحدث
'continue'
. راجع RFC 2616 القسم 8.2.3 لمزيد من المعلومات. - إرسال رأس Authorization سيتجاوز استخدام خيار
auth
لحساب المصادقة الأساسية.
مثال باستخدام URL
كـ options
:
const options = new URL('http://abc:');
const req = http.request(options, (res) => {
// ...
});
في الطلب الناجح، سيتم إرسال الأحداث التالية بالترتيب التالي:
'socket'
'response'
'data'
أي عدد من المرات، على كائنres
('data'
لن يتم إرساله على الإطلاق إذا كان نص الاستجابة فارغًا، على سبيل المثال، في معظم عمليات إعادة التوجيه)'end'
على كائنres
'close'
في حالة خطأ في الاتصال، سيتم إرسال الأحداث التالية:
'socket'
'error'
'close'
في حالة إغلاق الاتصال قبل الأوان قبل تلقي الاستجابة، سيتم إرسال الأحداث التالية بالترتيب التالي:
'socket'
'error'
مع خطأ بالرسالة'Error: socket hang up'
والكود'ECONNRESET'
'close'
في حالة إغلاق الاتصال قبل الأوان بعد تلقي الاستجابة، سيتم إرسال الأحداث التالية بالترتيب التالي:
'socket'
'response'
'data'
أي عدد من المرات، على كائنres
(تم إغلاق الاتصال هنا)
'aborted'
على كائنres
'close'
'error'
على كائنres
مع خطأ بالرسالة'Error: aborted'
والكود'ECONNRESET'
'close'
على كائنres
إذا تم استدعاء req.destroy()
قبل تعيين مقبس، فسيتم إرسال الأحداث التالية بالترتيب التالي:
- (تم استدعاء
req.destroy()
هنا) 'error'
مع خطأ بالرسالة'Error: socket hang up'
والكود'ECONNRESET'
، أو الخطأ الذي تم استدعاءreq.destroy()
به'close'
إذا تم استدعاء req.destroy()
قبل نجاح الاتصال، فسيتم إرسال الأحداث التالية بالترتيب التالي:
'socket'
- (تم استدعاء
req.destroy()
هنا) 'error'
مع خطأ بالرسالة'Error: socket hang up'
والكود'ECONNRESET'
، أو الخطأ الذي تم استدعاءreq.destroy()
به'close'
إذا تم استدعاء req.destroy()
بعد تلقي الاستجابة، فسيتم إرسال الأحداث التالية بالترتيب التالي:
'socket'
'response'
'data'
أي عدد من المرات، على كائنres
(تم استدعاء
req.destroy()
هنا)'aborted'
على كائنres
'close'
'error'
على كائنres
مع خطأ بالرسالة'Error: aborted'
والكود'ECONNRESET'
، أو الخطأ الذي تم استدعاءreq.destroy()
به'close'
على كائنres
إذا تم استدعاء req.abort()
قبل تعيين مقبس، فسيتم إرسال الأحداث التالية بالترتيب التالي:
- (تم استدعاء
req.abort()
هنا) 'abort'
'close'
إذا تم استدعاء req.abort()
قبل نجاح الاتصال، فسيتم إرسال الأحداث التالية بالترتيب التالي:
'socket'
- (تم استدعاء
req.abort()
هنا) 'abort'
'error'
مع خطأ بالرسالة'Error: socket hang up'
والكود'ECONNRESET'
'close'
إذا تم استدعاء req.abort()
بعد تلقي الاستجابة، فسيتم إرسال الأحداث التالية بالترتيب التالي:
'socket'
'response'
'data'
أي عدد من المرات، على كائنres
(تم استدعاء
req.abort()
هنا)'abort'
'aborted'
على كائنres
'error'
على كائنres
مع خطأ بالرسالة'Error: aborted'
والكود'ECONNRESET'
.'close'
'close'
على كائنres
لن يؤدي تعيين خيار timeout
أو استخدام الدالة setTimeout()
إلى إلغاء الطلب أو فعل أي شيء بخلاف إضافة حدث 'timeout'
.
سيؤدي تمرير AbortSignal
ثم استدعاء abort()
على AbortController
المطابق إلى التصرف بنفس طريقة استدعاء .destroy()
على الطلب. على وجه التحديد، سيتم إرسال حدث 'error'
مع خطأ بالرسالة 'AbortError: The operation was aborted'
، والكود 'ABORT_ERR'
و cause
، إذا تم توفير واحد.
http.validateHeaderName(name[, label])
[السجل]
الإصدار | التغييرات |
---|---|
v19.5.0, v18.14.0 | تمت إضافة المعامل label . |
v14.3.0 | تمت إضافته في: v14.3.0 |
يقوم بإجراء عمليات التحقق منخفضة المستوى على name
المقدم والتي تتم عند استدعاء res.setHeader(name, value)
.
سيؤدي تمرير قيمة غير قانونية كـ name
إلى ظهور TypeError
، يتم تحديده بواسطة code: 'ERR_INVALID_HTTP_TOKEN'
.
ليس من الضروري استخدام هذه الطريقة قبل تمرير الرؤوس إلى طلب HTTP أو استجابته. ستقوم وحدة HTTP تلقائيًا بالتحقق من صحة هذه الرؤوس.
مثال:
import { validateHeaderName } from 'node:http';
try {
validateHeaderName('');
} catch (err) {
console.error(err instanceof TypeError); // --> true
console.error(err.code); // --> 'ERR_INVALID_HTTP_TOKEN'
console.error(err.message); // --> 'يجب أن يكون اسم الرأس رمز HTTP صالح [""]'
}
const { validateHeaderName } = require('node:http');
try {
validateHeaderName('');
} catch (err) {
console.error(err instanceof TypeError); // --> true
console.error(err.code); // --> 'ERR_INVALID_HTTP_TOKEN'
console.error(err.message); // --> 'يجب أن يكون اسم الرأس رمز HTTP صالح [""]'
}
http.validateHeaderValue(name, value)
تمت إضافته في: v14.3.0
يقوم بإجراء عمليات التحقق منخفضة المستوى على value
المقدم والذي يتم عند استدعاء res.setHeader(name, value)
.
سيؤدي تمرير قيمة غير قانونية كـ value
إلى ظهور TypeError
.
- يتم تحديد خطأ القيمة غير المعرفة بواسطة
code: 'ERR_HTTP_INVALID_HEADER_VALUE'
. - يتم تحديد خطأ حرف القيمة غير الصالح بواسطة
code: 'ERR_INVALID_CHAR'
.
ليس من الضروري استخدام هذه الطريقة قبل تمرير الرؤوس إلى طلب HTTP أو استجابته. ستقوم وحدة HTTP تلقائيًا بالتحقق من صحة هذه الرؤوس.
أمثلة:
import { validateHeaderValue } from 'node:http';
try {
validateHeaderValue('x-my-header', undefined);
} catch (err) {
console.error(err instanceof TypeError); // --> true
console.error(err.code === 'ERR_HTTP_INVALID_HEADER_VALUE'); // --> true
console.error(err.message); // --> 'قيمة غير صالحة "غير معرف" للرأس "x-my-header"'
}
try {
validateHeaderValue('x-my-header', 'oʊmɪɡə');
} catch (err) {
console.error(err instanceof TypeError); // --> true
console.error(err.code === 'ERR_INVALID_CHAR'); // --> true
console.error(err.message); // --> 'حرف غير صالح في محتوى الرأس ["x-my-header"]'
}
const { validateHeaderValue } = require('node:http');
try {
validateHeaderValue('x-my-header', undefined);
} catch (err) {
console.error(err instanceof TypeError); // --> true
console.error(err.code === 'ERR_HTTP_INVALID_HEADER_VALUE'); // --> true
console.error(err.message); // --> 'قيمة غير صالحة "غير معرف" للرأس "x-my-header"'
}
try {
validateHeaderValue('x-my-header', 'oʊmɪɡə');
} catch (err) {
console.error(err instanceof TypeError); // --> true
console.error(err.code === 'ERR_INVALID_CHAR'); // --> true
console.error(err.message); // --> 'حرف غير صالح في محتوى الرأس ["x-my-header"]'
}
http.setMaxIdleHTTPParsers(max)
تمت إضافتها في: v18.8.0, v16.18.0
max
<number> الافتراضي:1000
.
يحدد الحد الأقصى لعدد مُحلّلات HTTP الخاملة.
WebSocket
تمت إضافتها في: v22.5.0
تنفيذ متوافق مع المتصفح لـ WebSocket
.