HTTP
[مستقر: 2 - مستقر]
مستقر: 2 استقرار: 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 الممكنة، فإن واجهة برمجة تطبيقات Node.js HTTP منخفضة المستوى للغاية. إنها تتعامل مع معالجة الدفق وتحليل الرسائل فقط. تقوم بتحليل الرسالة إلى عناوين وجسم، لكنها لا تحلل العناوين الفعلية أو الجسم.
راجع 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 => {
// قم بأشياء
})
.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 => {
// قم بأشياء مع الاستجابة
}
)
new Agent([options])
[History]
الإصدار | التغييرات |
---|---|
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
<Object> مجموعة من الخيارات القابلة للتكوين لإعدادها على الوكيل. يمكن أن تحتوي على الحقول التالية: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 |
كائن يحتوي على صفائف من المنافذ قيد الاستخدام حاليًا من قبل الوكيل. لا تقم بالتعديل.
Class: 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'
مضاف في: v0.3.2
يُصدر عندما يرسل الخادم استجابة HTTP "100 Continue"، وعادةً ما يكون ذلك لأن الطلب احتوى على "Expect: 100-continue". هذه تعليمات بأن يقوم العميل بإرسال جسم الطلب.
حدث: 'finish'
مضاف في: v0.3.6
يُصدر عندما يتم إرسال الطلب. وبشكل أكثر تحديدًا، يُصدر هذا الحدث عندما يتم تسليم الجزء الأخير من رؤوس الاستجابة والجسم إلى نظام التشغيل للنقل عبر الشبكة. لا يعني ذلك أن الخادم قد استلم أي شيء بعد.
حدث: 'information'
مضاف في: v10.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',
}
// إجراء طلب
const req = request(options)
req.end()
req.on('information', info => {
console.log(`حصلت على معلومات قبل الاستجابة الرئيسية: ${info.statusCode}`)
})
const http = require('node:http')
const options = {
host: '127.0.0.1',
port: 8080,
path: '/length_request',
}
// إجراء طلب
const req = http.request(options)
req.end()
req.on('information', info => {
console.log(`حصلت على معلومات قبل الاستجابة الرئيسية: ${info.statusCode}`)
})
لا تُصدر حالات 101 Upgrade هذا الحدث نظرًا لانقطاعها عن سلسلة طلب/استجابة HTTP التقليدية، مثل مآخذ الويب، أو ترقيات TLS في المكان، أو HTTP 2.0. للإشعار بإشعارات 101 Upgrade، استمع إلى حدث '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'
// إنشاء خادم HTTP
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) // صدى العودة
})
// الآن بعد تشغيل الخادم
server.listen(1337, '127.0.0.1', () => {
// تقديم طلب
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('تمت الترقية!')
socket.end()
process.exit(0)
})
})
const http = require('node:http')
// إنشاء خادم HTTP
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) // صدى العودة
})
// الآن بعد تشغيل الخادم
server.listen(1337, '127.0.0.1', () => {
// تقديم طلب
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('تمت الترقية!')
socket.end()
process.exit(0)
})
})
request.abort()
مضاف في: v0.3.8
مُهمل منذ: v14.1.0، v13.14.0
[مستقر: 0 - مُهمل]
مستقر: 0 استقرار: 0 - مُهمل: استخدم request.destroy()
بدلاً من ذلك.
يُشير إلى الطلب على أنه مُلغي. سيؤدي استدعاء هذا إلى إسقاط البيانات المتبقية في الاستجابة وتدمير المقبس.
request.aborted
[السجل]
الإصدار | التغييرات |
---|---|
v17.0.0، v16.12.0 | مُهمل منذ: v17.0.0، v16.12.0 |
v11.0.0 | لم تعد خاصية aborted رقمًا زمنيًا. |
v0.11.14 | مضاف في: v0.11.14 |
[مستقر: 0 - مُهمل]
مستقر: 0 استقرار: 0 - مُهمل. تحقق من request.destroyed
بدلاً من ذلك.
ستكون خاصية request.aborted
مساوية لـ true
إذا تم إلغاء الطلب.
request.connection
مضاف في: v0.3.0
مُهمل منذ: v13.0.0
[مستقر: 0 - مُهمل]
مستقر: 0 استقرار: 0 - مُهمل. استخدم request.socket
.
انظر request.socket
.
request.cork()
مضاف في: v13.2.0، v12.16.0
انظر writable.cork()
.
request.end([data[, encoding]][, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن الآن أن تكون معلمة data عبارة عن Uint8Array . |
v10.0.0 | تُعيد هذه الطريقة الآن مرجعًا إلى ClientRequest . |
v0.1.90 | مضاف في: v0.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])
[History]
الإصدار | التغييرات |
---|---|
v14.5.0 | تُعيد الدالة this للحفاظ على الاتساق مع تيارات Readable الأخرى. |
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' هي 'text/html'
const contentLength = request.getHeader('Content-Length')
// 'contentLength' من نوع رقم
const cookie = request.getHeader('Cookie')
// 'cookie' من نوع string[]
request.getHeaderNames()
مضاف في: v7.7.0
- قيمة الإرجاع: <string[]>
يرجع مصفوفة تحتوي على أسماء فريدة للرؤوس الصادرة الحالية. جميع أسماء الرؤوس صغيرة الحروف.
request.setHeader('Foo', 'bar')
request.setHeader('Cookie', ['foo=bar', 'bar=baz'])
const headerNames = request.getHeaderNames()
// headerNames === ['foo', 'cookie']
request.getHeaders()
مضاف في: v7.7.0
- قيمة الإرجاع: <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])
[History]
الإصدار | التغييرات |
---|---|
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(`عنوان IP الخاص بك هو ${ip} ومنفذ المصدر الخاص بك هو ${port}.`)
// استهلاك كائن الاستجابة
})
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(`عنوان IP الخاص بك هو ${ip} ومنفذ المصدر الخاص بك هو ${port}.`)
// استهلاك كائن الاستجابة
})
من المضمون أن تكون هذه الخاصية مثيلًا لفئة <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 مُجزّأ، بحيث يعرف الخادم متى تنتهي البيانات. يتم إضافة رأس Transfer-Encoding: chunked
. من الضروري استدعاء request.end()
لإنهاء إرسال الطلب.
حجة encoding
اختيارية وتنطبق فقط عندما تكون chunk
سلسلة. القيمة الافتراضية هي 'utf8'
.
حجة callback
اختيارية وسيتم استدعاؤها عند تفريغ هذا الجزء من البيانات، ولكن فقط إذا كان الجزء غير فارغ.
ترجع true
إذا تم تفريغ جميع البيانات بنجاح إلى مخزن مؤقت نواة النظام. ترجع false
إذا تم وضع جميع البيانات أو جزء منها في ذاكرة المستخدم. سيتم إصدار 'drain'
عندما يصبح المخزن المؤقت متاحًا مرة أخرى.
عندما يتم استدعاء دالة write
بسلسلة أو مخزن مؤقت فارغ، فإنها لا تفعل شيئًا وتنتظر المزيد من الإدخال.
الصنف: http.Server
مضاف في: v0.1.17
- يمتد: <net.Server>
الحدث: 'checkContinue'
مضاف في: v0.3.0
request
<http.IncomingMessage>response
<http.ServerResponse>
يتم بث هذا الحدث في كل مرة يتم فيها استقبال طلب مع HTTP Expect: 100-continue
. إذا لم يتم الاستماع إلى هذا الحدث، فسوف يستجيب الخادم تلقائيًا بـ 100 Continue
حسب الاقتضاء.
يتضمن التعامل مع هذا الحدث الاتصال بـ response.writeContinue()
إذا كان يجب على العميل المتابعة في إرسال جسم الطلب، أو إنشاء استجابة HTTP مناسبة (مثل 400 Bad Request) إذا كان يجب على العميل عدم المتابعة في إرسال جسم الطلب.
عندما يتم بث هذا الحدث والتعامل معه، فلن يتم بث حدث 'request'
.
الحدث: 'checkExpectation'
مضاف في: v5.5.0
request
<http.IncomingMessage>response
<http.ServerResponse>
يتم بث هذا الحدث في كل مرة يتم فيها استقبال طلب مع رأس HTTP Expect
، حيث لا تكون القيمة 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 | مضاف في: v0.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 | عدم الاستماع إلى هذا الحدث لم يعد يسبب تدمير المقبس إذا أرسل العميل رأس Upgrade. |
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])
[History]
الإصدار | التغييرات |
---|---|
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
[History]
الإصدار | التغييرات |
---|---|
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
[History]
الإصدار | التغييرات |
---|---|
v18.0.0 | تغيرت مهلة الطلب الافتراضية من عدم وجود مهلة إلى 300 ثانية (5 دقائق). |
v14.11.0 | تمت الإضافة في: v14.11.0 |
- <number> الافتراضي:
300000
يحدد قيمة مهلة الوقت بالميلي ثانية لتلقي الطلب بأكمله من العميل.
إذا انتهت مهلة الوقت، يستجيب الخادم برمز الحالة 408 دون إعادة توجيه الطلب إلى مستمع الطلب، ثم يغلق الاتصال.
يجب تعيينه على قيمة غير صفرية (مثل 120 ثانية) للحماية من هجمات الحرمان من الخدمة المحتملة في حالة نشر الخادم بدون وكيل عكسي أمامه.
server.setTimeout([msecs][, callback])
[History]
الإصدار | التغييرات |
---|---|
v13.0.0 | تم تغيير مهلة الوقت الافتراضية من 120 ثانية إلى 0 (بدون مهلة). |
v0.9.12 | تمت الإضافة في: v0.9.12 |
msecs
<number> الافتراضي: 0 (بدون مهلة)callback
<Function>- القيمة المُرجعة: <http.Server>
يحدد قيمة مهلة الوقت لمنافذ الاتصال، ويُصدر حدث 'timeout'
على كائن الخادم، ويمرّر منفذ الاتصال كوسيط، إذا حدثت مهلة.
إذا كان هناك مستمع لحدث 'timeout'
على كائن الخادم، فسيتم استدعاؤه مع منفذ الاتصال الذي انتهت مهلة وقته كوسيط.
بشكل افتراضي، لا يُنهي الخادم مهلة منافذ الاتصال. ومع ذلك، إذا تم تعيين مُنادٍ لحدث 'timeout'
الخاص بالخادم، فيجب التعامل مع حالات انتهاء المهلة بشكل صريح.
server.maxRequestsPerSocket
تمت الإضافة في: v16.10.0
- <number> طلبات لكل منفذ اتصال. الافتراضي: 0 (بدون حد)
الحد الأقصى لعدد الطلبات التي يمكن أن يتعامل معها منفذ الاتصال قبل إغلاق اتصال الحفاظ على الاتصال.
ستؤدي قيمة 0
إلى تعطيل الحد.
عندما يتم الوصول إلى الحد، سيُعيّن قيمة رأس Connection
إلى close
، لكنه لن يغلق الاتصال بالفعل، وستحصل الطلبات اللاحقة المرسلة بعد الوصول إلى الحد على 503 Service Unavailable
كاستجابة.
server.timeout
[History]
الإصدار | التغييرات |
---|---|
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 هي 'text/html'
const contentLength = response.getHeader('Content-Length')
// contentLength من نوع رقم
const setCookie = response.getHeader('set-cookie')
// setCookie من نوع 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
- المُرجَع: <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
عندما يكون صحيحًا، سيتم إنشاء رأس التاريخ وتقديمه تلقائيًا في الاستجابة إذا لم يكن موجودًا بالفعل في الرؤوس. القيمة الافتراضية هي صحيح.
يجب تعطيل هذا فقط للاختبار؛ يتطلب 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>
يُعيّن قيمة مهلة المقبس إلى msecs
. إذا تم توفير دالة مُراجعة، فسيتم إضافتها كمُستمع على حدث 'timeout'
في كائن الاستجابة.
إذا لم يتم إضافة أي مُستمع 'timeout'
إلى الطلب، أو الاستجابة، أو الخادم، فسيتم تدمير المقابس عند انتهاء مهلتها. إذا تم تعيين مُعالِج لأحداث 'timeout'
للطلب، أو الاستجابة، أو الخادم، فيجب التعامل مع المقابس التي انتهت مهلتها بشكل صريح.
response.socket
مضاف في: v0.3.0
مرجع إلى المقبس الأساسي. عادةً ما لا يرغب المستخدمون في الوصول إلى هذه الخاصية. على وجه الخصوص، لن يُصدر المقبس أحداث 'readable'
نظرًا لكيفية ارتباط مُحلل البروتوكول بالمقبس. بعد response.end()
، يتم إلغاء الخاصية.
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>- القيمة المُرجعّة: <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
إذا تم إفراغ جميع البيانات بنجاح إلى مخزن مؤقت للنواة. ترجع false
إذا تم وضع جميع البيانات أو جزء منها في ذاكرة المستخدم. سيتم إصدار 'drain'
عندما يصبح المخزن المؤقت فارغًا مرة أخرى.
response.writeContinue()
مضاف في: v0.3.0
يرسل رسالة HTTP/1.1 100 Continue إلى العميل، مما يشير إلى أنه يجب إرسال جسم الطلب. راجع حدث 'checkContinue'
على Server
.
response.writeEarlyHints(hints[, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v18.11.0 | السماح بمرور التلميحات ككائن. |
v18.11.0 | مضاف في: v18.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])
[السجل]
الإصدار | التغييرات |
---|---|
v14.14.0 | السماح بمرور الرؤوس كمصفوفة. |
v11.10.0, v10.17.0 | إرجاع this من writeHead() للسماح بالتسلسل مع end() . |
v5.11.0, v4.4.5 | يتم طرح RangeError إذا لم يكن statusCode رقمًا في النطاق [100, 999] . |
v0.1.30 | مضاف في: v0.1.30 |
statusCode
<number>statusMessage
<string>headers
<Object> | <Array>- القيمة المرجعة: <http.ServerResponse>
يرسل رأس استجابة إلى الطلب. رمز الحالة هو رمز حالة HTTP مكون من 3 أرقام، مثل 404
. الوسيطة الأخيرة، headers
، هي رؤوس الاستجابة. اختياريًا، يمكن للمرء إعطاء statusMessage
يمكن قراءته بواسطة الإنسان كوسيطة ثانية.
قد يكون headers
مصفوفة حيث تكون المفاتيح والقيم في نفس القائمة. إنها ليست قائمة من الأزواج. لذلك، فإن الإزاحات ذات الأرقام الزوجية هي قيم المفاتيح، والإزاحات ذات الأرقام الفردية هي القيم المرتبطة. المصفوفة بنفس التنسيق مثل 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()
بدلاً من ذلك.
// Returns 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()
مضاف في: v10.0.0
يرسل رسالة HTTP/1.1 102 Processing إلى العميل، مما يشير إلى أنه يجب إرسال جسم الطلب.
الصنف: http.IncomingMessage
[السجل]
الإصدار | التغييرات |
---|---|
v15.5.0 | قيمة destroyed تُرجع true بعد استهلاك البيانات الواردة. |
v13.1.0, v12.16.0 | قيمة readableHighWaterMark تعكس قيمة المقبس. |
v0.1.17 | مضاف في: v0.1.17 |
- يمتد: <stream.Readable>
يتم إنشاء كائن IncomingMessage
بواسطة http.Server
أو http.ClientRequest
ويتم تمريره كأول وسيطة إلى حدث 'request'
و 'response'
على التوالي. ويمكن استخدامه للوصول إلى حالة الاستجابة، والرؤوس، والبيانات.
على عكس قيمته socket
التي هي فئة فرعية من <stream.Duplex>، يمتد IncomingMessage
نفسه من <stream.Readable> ويتم إنشاؤه بشكل منفصل لتحليل وإصدار الرؤوس والدفع HTTP الواردة، حيث قد يتم إعادة استخدام المقبس الأساسي عدة مرات في حالة keep-alive.
الحدث: 'aborted'
مضاف في: v0.3.8
مُهمل منذ: v17.0.0, v16.12.0
يُصدر عندما يتم إيقاف الطلب.
الحدث: 'close'
[السجل]
الإصدار | التغييرات |
---|---|
v16.0.0 | يتم الآن إصدار حدث الإغلاق عندما يتم إكمال الطلب وليس عندما يتم إغلاق المقبس الأساسي. |
v0.4.2 | مضاف في: v0.4.2 |
يُصدر عندما يتم إكمال الطلب.
message.aborted
مضاف في: v10.1.0
مُهمل منذ: v17.0.0, v16.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('The connection was terminated while the message was still being sent')
})
}
)
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() عدم تجاهل الرؤوس المكررة، بل يتم دمجها باستخدام فاصلة، وفقًا للمقطع 5.3 من RFC 9110. |
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()
. راجع المقطع 5.3 من RFC 9110 لمزيد من المعلومات. 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 إلى أجزائه:
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.
حدث: 'drain'
مضاف في: v0.3.6
يُصدر عندما تصبح ذاكرة التخزين المؤقت للرسالة خالية مرة أخرى.
حدث: 'finish'
مضاف في: v0.1.17
يُصدر عند الانتهاء من الإرسال بنجاح.
حدث: '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[]> قيمة الرأس- مُخرجات: <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
يدمر الرسالة. بمجرد ربط مقبس بالرسالة وتوصيله، سيتم تدمير هذا المقبس أيضًا.
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()
.
// تُرجع 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
.- القيمة المُرجعة: <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])
[History]
الإصدار | التغييرات |
---|---|
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
<Object>connectionsCheckingInterval
: يحدد قيمة الفاصل الزمني بالميلي ثانية للتحقق من انتهاء وقت الطلب والرؤوس في الطلبات غير المكتملة. الافتراضي:30000
.headersTimeout
: يحدد قيمة مهلة زمنية بالميلي ثانية لاستقبال رؤوس HTTP الكاملة من العميل. راجعserver.headersTimeout
لمزيد من المعلومات. الافتراضي:60000
.highWaterMark
<number> قد يلغي بشكل اختياري جميع علاماتreadableHighWaterMark
وwritableHighWaterMark
الخاصة بـsocket
. هذا يؤثر على خاصيةhighWaterMark
لكل منIncomingMessage
وServerResponse
. الافتراضي: راجعstream.getDefaultHighWaterMark()
.insecureHTTPParser
<boolean> إذا تم تعيينه علىtrue
، فسوف يستخدم محلل HTTP مع تمكين علامات التسامح. يجب تجنب استخدام محلل غير آمن. راجع--insecure-http-parser
لمزيد من المعلومات. الافتراضي:false
.IncomingMessage
<http.IncomingMessage> يحدد فئةIncomingMessage
التي سيتم استخدامها. مفيد لتوسيعIncomingMessage
الأصلي. الافتراضي:IncomingMessage
.joinDuplicateHeaders
<boolean> إذا تم تعيينه علىtrue
، يسمح هذا الخيار بدمج قيم سطر الحقل للعديد من الرؤوس في طلب باستخدام فاصلة (,
) بدلاً من تجاهل المكررات. لمزيد من المعلومات، يرجى الرجوع إلىmessage.headers
. الافتراضي:false
.keepAlive
<boolean> إذا تم تعيينه علىtrue
، فإنه يمكّن وظيفة الحفاظ على الاتصال على المقبس مباشرة بعد استقبال اتصال داخلي جديد، بشكل مشابه لما يتم فعله في [socket.setKeepAlive([enable][, initialDelay])
][socket.setKeepAlive(enable, initialDelay)
]. الافتراضي:false
.keepAliveInitialDelay
<number> إذا تم تعيينه على رقم موجب، فإنه يحدد التأخير الأولي قبل إرسال أول اختبار للحفاظ على الاتصال على مقبس خامد. الافتراضي:0
.keepAliveTimeout
: عدد ميلي ثانية من الخمول الذي يحتاج الخادم إلى انتظاره لبيانات واردة إضافية، بعد الانتهاء من كتابة الاستجابة الأخيرة، قبل تدمير المقبس. راجعserver.keepAliveTimeout
لمزيد من المعلومات. الافتراضي:5000
.maxHeaderSize
<number> قد يلغي بشكل اختياري قيمة--max-http-header-size
للطلبات التي يتلقاها هذا الخادم، أي الحد الأقصى لطول رؤوس الطلب بالبايت. الافتراضي: 16384 (16 كيلوبايت).noDelay
<boolean> إذا تم تعيينه علىtrue
، فإنه يعطل استخدام خوارزمية ناجل مباشرة بعد استقبال اتصال داخلي جديد. الافتراضي:true
.requestTimeout
: يحدد قيمة مهلة زمنية بالميلي ثانية لاستقبال الطلب بالكامل من العميل. راجعserver.requestTimeout
لمزيد من المعلومات. الافتراضي:300000
.requireHostHeader
<boolean> إذا تم تعيينه علىtrue
، فإنه يجبر الخادم على الاستجابة برمز حالة 400 (طلب غير صالح) لأي رسالة طلب HTTP/1.1 تفتقر إلى رأس المضيف (كما هو مطلوب في المواصفات). الافتراضي:true
.ServerResponse
<http.ServerResponse> يحدد فئةServerResponse
التي سيتم استخدامها. مفيد لتوسيعServerResponse
الأصلي. الافتراضي:ServerResponse
.uniqueHeaders
<Array> قائمة برؤوس الاستجابة التي يجب إرسالها مرة واحدة فقط. إذا كانت قيمة الرأس عبارة عن مصفوفة، فسيتم دمج العناصر باستخدام;
.rejectNonStandardBodyWrites
<boolean> إذا تم تعيينه علىtrue
، فسيتم إرسال خطأ عند الكتابة إلى استجابة HTTP ليس لها جسم. الافتراضي:false
.
requestListener
<Function>المُرجَع: <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])
[History]
الإصدار | التغييرات |
---|---|
v10.9.0 | أصبح من الممكن الآن تمرير مُعامل url مع كائن options منفصل. |
v7.5.0 | يمكن أن يكون مُعامل options كائن WHATWG URL . |
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
// أي رمز حالة 2xx يشير إلى استجابة ناجحة ولكن
// هنا نقوم فقط بالتحقق من 200.
if (statusCode !== 200) {
error = new Error('فشل الطلب.\n' + `رمز الحالة: ${statusCode}`)
} else if (!/^application\/json/.test(contentType)) {
error = new Error('نوع محتوى غير صالح.\n' + `كان متوقعًا application/json ولكن تم استلام ${contentType}`)
}
if (error) {
console.error(error.message)
// استهلاك بيانات الاستجابة لتحرير الذاكرة
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(`حدث خطأ: ${e.message}`)
})
// إنشاء خادم محلي لتلقي البيانات من
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 كائن URL من WHATWG. |
v0.3.6 | تمت الإضافة في: v0.3.6 |
options
<كائن>agent
<http.Agent
> | <قيمة منطقية> يتحكم في سلوكAgent
. القيم الممكنة:undefined
(افتراضي): استخدمhttp.globalAgent
لهذا المضيف والمنفذ.كائن
Agent
: استخدم صراحةً كائنAgent
المُمرر.false
: يتسبب في استخدامAgent
جديد بقيم افتراضية.auth
<سلسلة> مصادقة أساسية ('user:password'
) لحساب رأس Authorization.createConnection
<دالة> دالة تُنتج مقبسًا/تيارًا لاستخدامه للطلب عندما لا يتم استخدام خيارagent
. يمكن استخدام هذا لتجنب إنشاء فئةAgent
مخصصة فقط لتجاوز دالةcreateConnection
الافتراضية. راجعagent.createConnection()
لمزيد من التفاصيل. أي تيارDuplex
هو قيمة إرجاع صالحة.defaultPort
<عدد> المنفذ الافتراضي للبروتوكول. الافتراضي:agent.defaultPort
إذا تم استخدامAgent
، وإلاundefined
.family
<عدد> عائلة عنوان IP لاستخدامها عند حلhost
أوhostname
. القيم الصالحة هي4
أو6
. عندما لا يتم تحديده، سيتم استخدام كل من IP v4 و v6.headers
<كائن> كائن يحتوي على رؤوس الطلب.hints
<عدد>dns.lookup()
hintsاختياري.host
<سلسلة> اسم نطاق أو عنوان IP للخادم لإصدار الطلب إليه. الافتراضي:'localhost'
.hostname
<سلسلة> اسم مستعار لـhost
. لدعمurl.parse()
، سيتم استخدامhostname
إذا تم تحديد كل منhost
وhostname
.insecureHTTPParser
<قيمة منطقية> إذا تم تعيينه علىtrue
، فسوف يستخدم محلل HTTP مع تمكين علامات التسامح. يجب تجنب استخدام محلل غير آمن. راجع--insecure-http-parser
لمزيد من المعلومات. الافتراضي:false
joinDuplicateHeaders
<قيمة منطقية> يقوم بدمج قيم سطر الحقل للعديد من الرؤوس في طلب باستخدام,
بدلاً من تجاهل المكررات. راجعmessage.headers
لمزيد من المعلومات. الافتراضي:false
.localAddress
<سلسلة> الواجهة المحلية للربط لاتصالات الشبكة.localPort
<عدد> المنفذ المحلي للاتصال منه.lookup
<دالة> دالة بحث مخصصة. الافتراضي:dns.lookup()
.maxHeaderSize
<عدد> يتجاوز اختيارياً قيمة--max-http-header-size
(الحد الأقصى لطول رؤوس الاستجابة بالبايت) للاستجابات الواردة من الخادم. الافتراضي: 16384 (16 كيلوبايت).method
<سلسلة> سلسلة تحدد طريقة طلب HTTP. الافتراضي:'GET'
.path
<سلسلة> مسار الطلب. يجب أن يتضمن سلسلة الاستعلام إن وجدت. على سبيل المثال،'/index.html?page=12'
. يتم طرح استثناء عندما يحتوي مسار الطلب على أحرف غير قانونية. حاليًا، يتم رفض المسافات فقط، ولكن قد يتغير ذلك في المستقبل. الافتراضي:'/'
.port
<عدد> منفذ الخادم البعيد. الافتراضي:defaultPort
إذا تم تعيينه، وإلا80
.protocol
<سلسلة> البروتوكول الذي يجب استخدامه. الافتراضي:'http:'
.setDefaultHeaders
<قيمة منطقية>: يحدد ما إذا كان سيتم إضافة رؤوس افتراضية تلقائيًا أم لا مثلConnection
,Content-Length
,Transfer-Encoding
, وHost
. إذا تم تعيينه علىfalse
، فيجب إضافة جميع الرؤوس الضرورية يدويًا. الافتراضي هوtrue
.setHost
<قيمة منطقية>: يحدد ما إذا كان سيتم إضافة رأسHost
تلقائيًا أم لا. إذا تم توفيره، فسوف يتجاوز هذاsetDefaultHeaders
. الافتراضي هوtrue
.signal
<AbortSignal
>:AbortSignal
الذي يمكن استخدامه لإلغاء طلب جاري.socketPath
<سلسلة> مقبس مجال يونكس. لا يمكن استخدامه إذا تم تحديد أحدhost
أوport
، حيث يحددان مقبس TCP.timeout
<عدد>: رقم يحدد مهلة المقبس بالميلي ثانية. سيقوم هذا بتعيين مهلة قبل توصيل المقبس.uniqueHeaders
<مصفوفة> قائمة برؤوس الطلب التي يجب إرسالها مرة واحدة فقط. إذا كانت قيمة الرأس عبارة عن مصفوفة، فسيتم دمج العناصر باستخدام;
.
callback
<دالة>الإرجاع: <
http.ClientRequest
>
يتم دعم options
في socket.connect()
أيضًا.
يحافظ Node.js على العديد من الاتصالات لكل خادم لإجراء طلبات HTTP. تسمح هذه الدالة بإصدار الطلبات بشكل شفاف.
يمكن أن يكون url
سلسلة أو كائن URL
. إذا كان url
سلسلة، فسيتم تحليله تلقائيًا باستخدام new URL()
. إذا كان كائن URL
، فسيتم تحويله تلقائيًا إلى كائن options
عادي.
إذا تم تحديد كل من url
و options
، فسيتم دمج الكائنات، مع تمتع خصائص options
بالأولوية.
سيتم إضافة معلمة callback
الاختيارية كـ listener لمرة واحدة لحدث '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'
، إذا لم يتم تسجيل أي listeners، فسيتم طرح الخطأ.
هناك بعض الرؤوس الخاصة التي يجب ملاحظتها.
- إرسال 'Connection: keep-alive' سيُعلم Node.js بأنه يجب الحفاظ على الاتصال بالخادم حتى الطلب التالي.
- إرسال رأس 'Content-Length' سيُعطل ترميز التشظي الافتراضي.
- إرسال رأس 'Expect' سيرسل رؤوس الطلب على الفور. عادةً، عند إرسال 'Expect: 100-continue'، يجب تعيين كل من مهلة و listener لحدث
'continue'
. راجع RFC 2616 Section 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])
[History]
الإصدار | التغييرات |
---|---|
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) // --> 'Header name must be a valid HTTP token [""]'
}
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) // --> 'Header name must be a valid HTTP token [""]'
}
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) // --> 'Invalid value "undefined" for header "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) // --> 'Invalid character in header content ["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) // --> 'Invalid value "undefined" for header "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) // --> 'Invalid character in header content ["x-my-header"]'
}
http.setMaxIdleHTTPParsers(max)
أضيف في: v18.8.0، v16.18.0
max
<رقم> افتراضيًا:1000
.
تعيين الحد الأقصى لعدد محليّات تحليل HTTP الخاملة.
WebSocket
أضيف في: v22.5.0
تنفيذ متوافق مع المتصفح لـ WebSocket
.