Skip to content

HTTP

[مستقر: 2 - مستقر]

مستقر: 2 استقرار: 2 - مستقر

رمز المصدر: lib/http.js

يمكن استيراد هذا الوحدة، التي تحتوي على كل من العميل والخادم، عبر require('node:http') (CommonJS) أو import * as http from 'node:http' (وحدة ES).

صُممت واجهات HTTP في Node.js لدعم العديد من ميزات البروتوكول التي كان من الصعب استخدامها تقليديًا. على وجه الخصوص، الرسائل الكبيرة، التي قد تكون مشفرة جزئيًا. تهتم الواجهة بعدم تخزين طلبات أو استجابات كاملة أبدًا، لذلك يمكن للمستخدم دفق البيانات.

تُمثَّل عناوين رسائل HTTP بواسطة كائن مثل هذا:

json
{
  "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 مثل ما يلي:

js
;[
  '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 واحد مفتوحًا لفترة طويلة دون الاحتفاظ به في الوكيل، يمكن القيام بشيء مثل ما يلي:

js
http
  .get(options, res => {
    // قم بأشياء
  })
  .on('socket', socket => {
    socket.emit('agentRemove')
  })

يمكن أيضًا استخدام وكيل لطلب فردي. من خلال توفير {agent: false} كخيار لوظائف http.get() أو http.request()، سيتم استخدام Agent للاستخدام مرة واحدة مع الخيارات الافتراضية لاتصال العميل.

agent:false:

js
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.

js
import { Agent, request } from 'node:http'
const keepAliveAgent = new Agent({ keepAlive: true })
options.agent = keepAliveAgent
request(options, onResponseCallback)
js
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 عن طلب ويمكن أن يُحفظ بواسطة Agent. السلوك الافتراضي هو:

js
socket.setKeepAlive(true, this.keepAliveMsecs)
socket.unref()
return true

يمكن تجاوز هذه الطريقة بواسطة فئة فرعية Agent معينة. إذا قامت هذه الطريقة بإرجاع قيمة خاطئة، فسيتم تدمير المقبس بدلاً من الحفاظ عليه للاستخدام مع الطلب التالي.

يمكن أن تكون وسيطة socket مثيلًا لـ <net.Socket>، وهي فئة فرعية من <stream.Duplex>.

agent.reuseSocket(socket, request)

أضيف في: v8.1.0

يتم استدعاء هذه الدالة عندما يتم إرفاق socket بـ request بعد الحفاظ عليه بسبب خيارات keep-alive. السلوك الافتراضي هو:

js
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
  • options <Object> مجموعة من الخيارات التي تقدم معلومات لإنشاء الاسم

    • host <string> اسم نطاق أو عنوان IP للخادم لإرسال الطلب إليه
    • port <number> منفذ الخادم البعيد
    • localAddress <string> الواجهة المحلية للربط باتصالات الشبكة عند إرسال الطلب
    • family <integer> يجب أن يكون 4 أو 6 إذا لم يكن هذا مساويًا لـ undefined.
  • قيمة الإرجاع: <string>

الحصول على اسم فريد لمجموعة من خيارات الطلب، لتحديد ما إذا كان يمكن إعادة استخدام الاتصال. بالنسبة إلى وكيل 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.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

يُصدر في كل مرة يستجيب فيها الخادم لطلب باستخدام طريقة CONNECT. إذا لم يتم الاستماع إلى هذا الحدث، فسيتم إغلاق اتصالات العملاء الذين يتلقون طريقة CONNECT.

يُضمن تمرير مثيل من فئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، إلى هذا الحدث، ما لم يُحدد المستخدم نوع مقبس بخلاف <net.Socket>.

زوج عميل وخادم يُوضح كيفية الاستماع إلى حدث 'connect' :

js
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()
    })
  })
})
js
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

يُصدر عندما يرسل الخادم استجابة وسيطة 1xx (باستثناء 101 Upgrade). سيستلم مستمعو هذا الحدث كائنًا يحتوي على إصدار HTTP، ورمز الحالة، ورسالة الحالة، وكائن رؤوس القيمة الرئيسية، ومصفوفة تحتوي على أسماء الرؤوس الخام متبوعة بقيمها الخاصة.

js
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}`)
})
js
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

يتم بثه عند استلام استجابة لهذا الطلب. لا يتم بث هذا الحدث إلا مرة واحدة.

حدث: 'socket'

مضاف في: v0.5.3

يُضمن تمرير مثيل من فئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، إلى هذا الحدث، ما لم يحدد المستخدم نوع مقبس بخلاف <net.Socket>.

حدث: 'timeout'

مضاف في: v0.7.8

يتم بثه عندما ينتهي وقت انتظار المقبس الأساسي بسبب عدم النشاط. هذا لا يفعل سوى الإبلاغ عن أن المقبس كان خاملاً. يجب تدمير الطلب يدويًا.

انظر أيضًا: request.setTimeout().

حدث: 'upgrade'

مضاف في: v0.1.94

يتم بثه في كل مرة يستجيب فيها الخادم لطلب باستخدام ترقية. إذا لم يتم الاستماع إلى هذا الحدث وكان رمز حالة الاستجابة 101 بروتوكولات تبديل، فسيتم إغلاق اتصالات العملاء الذين يتلقون رأس ترقية.

يُضمن تمرير مثيل من فئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، إلى هذا الحدث، ما لم يحدد المستخدم نوع مقبس بخلاف <net.Socket>.

زوج خادم عميل يُوضح كيفية الاستماع إلى حدث 'upgrade'.

js
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)
  })
})
js
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

ينهي إرسال الطلب. إذا كانت هناك أجزاء من الجسم غير مُرسلة، فسوف يُفرغها إلى الدفق. إذا كان الطلب مُجزأ، فسيرسل '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 <Error> اختياري، خطأ لإرساله مع حدث 'error' .
  • القيمة المُرجعة: <this>

تدمير الطلب. وإرسال حدث '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().

js
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

يرجع مصفوفة تحتوي على أسماء فريدة للرؤوس الصادرة الحالية. جميع أسماء الرؤوس صغيرة الحروف.

js
request.setHeader('Foo', 'bar')
request.setHeader('Cookie', ['foo=bar', 'bar=baz'])

const headerNames = request.getHeaderNames()
// headerNames === ['foo', 'cookie']

request.getHeaders()

مضاف في: v7.7.0

يرجع نسخة ضحلة من الرؤوس الصادرة الحالية. بما أن نسخة ضحلة تُستخدم، يمكن تغيير قيم المصفوفة بدون مكالمات إضافية لطرق وحدة http المختلفة المتعلقة بالرؤوس. مفاتيح الكائن المُرجع هي أسماء الرؤوس والقيم هي قيم الرؤوس المُقابلة. جميع أسماء الرؤوس صغيرة الحروف.

الكائن الذي يُرجعه أسلوب request.getHeaders() لا يرث نموذجيًا من كائن JavaScript Object. هذا يعني أن أساليب Object النموذجية مثل obj.toString(), obj.hasOwnProperty(), وغيرها غير مُعرّفة ولن تعمل.

js
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

يرجع مصفوفة تحتوي على أسماء فريدة للرؤوس الخاملة الصادرة الحالية. يتم إرجاع أسماء الرؤوس بالحالة الدقيقة التي تم تعيينها.

js
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 معين حاليًا في الرؤوس الصادرة. مطابقة اسم الرأس غير حساسة لحالة الأحرف.

js
const hasContentType = request.hasHeader('content-type')

request.maxHeadersCount

يحد من الحد الأقصى لعدد رؤوس الاستجابة. إذا تم تعيينه إلى 0، فلن يتم تطبيق أي حد.

request.path

مضاف في: v0.4.0

request.method

مضاف في: v0.1.97

request.host

مضاف في: v14.5.0, v12.19.0

request.protocol

مضاف في: v14.5.0, v12.19.0

request.removeHeader(name)

مضاف في: v1.6.0

يزيل رأسًا تم تعريفه بالفعل في كائن الرؤوس.

js
request.removeHeader('Content-Type')

request.reusedSocket

أضيف في: v13.0.0، v12.16.0

  • <boolean> ما إذا كان الطلب قد أُرسل عبر مقبس مُعاد استخدامه.

عند إرسال طلب عبر وكيل مُمكّن للحفاظ على الاتصال، قد يتم إعادة استخدام المقبس الأساسي. ولكن إذا أغلق الخادم الاتصال في وقت غير مناسب، فقد يواجه العميل خطأ "ECONNRESET".

js
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 ثوانٍ لتسهيل الوصول إلى مهلة الخمول
js
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 ثوانٍ لتسهيل الوصول إلى مهلة الخمول

بإشارة طلب ما إذا كان قد أعاد استخدام المقبس أم لا، يمكننا إجراء إعادة محاولة أوتوماتيكية للخطأ بناءً عليه.

js
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()
js
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() قيمًا غير سلسلية. ومع ذلك، سيتم تحويل القيم غير السلسلية إلى سلاسل لنقل الشبكة.

js
request.setHeader('Content-Type', 'application/json')

أو

js
request.setHeader('Cookie', ['type=ninja', 'language=javascript'])

عندما تكون القيمة سلسلة، سيتم طرح استثناء إذا كانت تحتوي على أحرف خارج ترميز latin1.

إذا كنت بحاجة إلى تمرير أحرف UTF-8 في القيمة، يرجى ترميز القيمة باستخدام معيار RFC 8187.

js
const filename = 'Rock 🎵.txt'
request.setHeader('Content-Disposition', `attachment; filename*=utf-8''${encodeURIComponent(filename)}`)

request.setNoDelay([noDelay])

مضاف في: v0.5.9

بمجرد تعيين مقبس لهذا الطلب ويتم توصيله، سيتم استدعاء 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' نظرًا لكيفية ارتباط مُحلل البروتوكول بالمقبس.

js
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}.`)
  // استهلاك كائن الاستجابة
})
js
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

يرسل جزءًا من الجسم. يمكن استدعاء هذه الطريقة عدة مرات. إذا لم يتم تعيين Content-Length، فسيتم ترميز البيانات تلقائيًا باستخدام ترميز نقل HTTP مُجزّأ، بحيث يعرف الخادم متى تنتهي البيانات. يتم إضافة رأس Transfer-Encoding: chunked. من الضروري استدعاء request.end() لإنهاء إرسال الطلب.

حجة encoding اختيارية وتنطبق فقط عندما تكون chunk سلسلة. القيمة الافتراضية هي 'utf8'.

حجة callback اختيارية وسيتم استدعاؤها عند تفريغ هذا الجزء من البيانات، ولكن فقط إذا كان الجزء غير فارغ.

ترجع true إذا تم تفريغ جميع البيانات بنجاح إلى مخزن مؤقت نواة النظام. ترجع false إذا تم وضع جميع البيانات أو جزء منها في ذاكرة المستخدم. سيتم إصدار 'drain' عندما يصبح المخزن المؤقت متاحًا مرة أخرى.

عندما يتم استدعاء دالة write بسلسلة أو مخزن مؤقت فارغ، فإنها لا تفعل شيئًا وتنتظر المزيد من الإدخال.

الصنف: http.Server

مضاف في: v0.1.17

الحدث: 'checkContinue'

مضاف في: v0.3.0

يتم بث هذا الحدث في كل مرة يتم فيها استقبال طلب مع HTTP Expect: 100-continue. إذا لم يتم الاستماع إلى هذا الحدث، فسوف يستجيب الخادم تلقائيًا بـ 100 Continue حسب الاقتضاء.

يتضمن التعامل مع هذا الحدث الاتصال بـ response.writeContinue() إذا كان يجب على العميل المتابعة في إرسال جسم الطلب، أو إنشاء استجابة HTTP مناسبة (مثل 400 Bad Request) إذا كان يجب على العميل عدم المتابعة في إرسال جسم الطلب.

عندما يتم بث هذا الحدث والتعامل معه، فلن يتم بث حدث 'request'.

الحدث: 'checkExpectation'

مضاف في: v5.5.0

يتم بث هذا الحدث في كل مرة يتم فيها استقبال طلب مع رأس HTTP Expect، حيث لا تكون القيمة 100-continue. إذا لم يتم الاستماع إلى هذا الحدث، فسوف يستجيب الخادم تلقائيًا بـ 417 Expectation Failed حسب الاقتضاء.

عندما يتم بث هذا الحدث والتعامل معه، فلن يتم بث حدث 'request'.

الحدث: 'clientError'

[السجل]

الإصدارالتغييرات
v12.0.0سيعيد السلوك الافتراضي 431 Request Header Fields Too Large إذا حدث خطأ HPE_HEADER_OVERFLOW.
v9.4.0rawPacket هو المخزن المؤقت الحالي الذي تم تحليله للتو. إن إضافة هذا المخزن المؤقت إلى كائن الخطأ لحدث 'clientError' يجعل من الممكن للمطورين تسجيل الحزمة التالفة.
v6.0.0لن يتم تنفيذ الإجراء الافتراضي المتمثل في استدعاء .destroy() على socket بعد الآن إذا كانت هناك مستمعون مرتبطون بـ 'clientError'.
v0.1.94مضاف في: v0.1.94

إذا قام اتصال عميل ببث حدث '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 الذي نشأ منه الخطأ.

js
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)
js
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. قبل محاولة إرسال بيانات إلى المقبس، من الأفضل التحقق من أنه لا يزال قابلاً للكتابة.

js
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

يُصدر في كل مرة يطلب فيها عميل طريقة HTTP CONNECT. إذا لم يتم الاستماع إلى هذا الحدث، فسيتم إغلاق اتصالات العملاء الذين يطلبون طريقة CONNECT.

يُضمن تمرير مثيل لفئة <net.Socket>، وهي فئة فرعية من <stream.Duplex>، إلى هذا الحدث، ما لم يحدد المستخدم نوع مقبس بخلاف <net.Socket>.

بعد إصدار هذا الحدث، لن يكون لمقبس الطلب مُستمع حدث 'data'، مما يعني أنه سيتعين ربطه من أجل التعامل مع البيانات المرسلة إلى الخادم على هذا المقبس.

حدث: 'connection'

مضاف في: v0.1.0

يُصدر هذا الحدث عند إنشاء دفق 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

عندما يصل عدد الطلبات على مقبس إلى عتبة server.maxRequestsPerSocket، فإن الخادم سيُلغي الطلبات الجديدة وسيُصدر حدث 'dropRequest' بدلاً من ذلك، ثم سيرسل 503 إلى العميل.

حدث: 'request'

مضاف في: v0.1.0

يُصدر في كل مرة يكون هناك طلب. قد يكون هناك طلبات متعددة لكل اتصال (في حالة اتصالات 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

يُوقف الخادم عن قبول اتصالات جديدة ويُغلق جميع الاتصالات المتصلة بهذا الخادم والتي لا تُرسل طلبًا أو تنتظر استجابة. انظر net.Server.close().

js
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.

js
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

يُغلق جميع الاتصالات المتصلة بهذا الخادم والتي لا تُرسل طلبًا أو تنتظر استجابة.

js
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

يحدد المدة التي ينتظرها محلل البيانات لتلقي رؤوس HTTP الكاملة.

إذا انتهت مهلة الوقت، يستجيب الخادم برمز الحالة 408 دون إعادة توجيه الطلب إلى مستمع الطلب، ثم يغلق الاتصال.

يجب تعيينه على قيمة غير صفرية (مثل 120 ثانية) للحماية من هجمات الحرمان من الخدمة المحتملة في حالة نشر الخادم بدون وكيل عكسي أمامه.

server.listen()

يبدأ تشغيل خادم HTTP للاستماع إلى الاتصالات. هذه الطريقة مطابقة لـ server.listen() من net.Server.

server.listening

تمت الإضافة في: v5.7.0

  • <boolean> يشير إلى ما إذا كان الخادم يستمع إلى الاتصالات أم لا.

server.maxHeadersCount

تمت الإضافة في: v0.7.0

يحد من الحد الأقصى لعدد رؤوس الواردة. إذا تم تعيينه على 0، فلن يتم تطبيق أي حد.

server.requestTimeout

[History]

الإصدارالتغييرات
v18.0.0تغيرت مهلة الطلب الافتراضية من عدم وجود مهلة إلى 300 ثانية (5 دقائق).
v14.11.0تمت الإضافة في: v14.11.0

يحدد قيمة مهلة الوقت بالميلي ثانية لتلقي الطلب بأكمله من العميل.

إذا انتهت مهلة الوقت، يستجيب الخادم برمز الحالة 408 دون إعادة توجيه الطلب إلى مستمع الطلب، ثم يغلق الاتصال.

يجب تعيينه على قيمة غير صفرية (مثل 120 ثانية) للحماية من هجمات الحرمان من الخدمة المحتملة في حالة نشر الخادم بدون وكيل عكسي أمامه.

server.setTimeout([msecs][, callback])

[History]

الإصدارالتغييرات
v13.0.0تم تغيير مهلة الوقت الافتراضية من 120 ثانية إلى 0 (بدون مهلة).
v0.9.12تمت الإضافة في: v0.9.12

يحدد قيمة مهلة الوقت لمنافذ الاتصال، ويُصدر حدث '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، وليس بواسطة المستخدم. يتم تمريره كمعامل ثاني لحدث 'request'.

حدث: 'close'

مضاف في: v0.6.7

يشير إلى اكتمال الاستجابة، أو تم إنهاء اتصالها الأساسي قبل الأوان (قبل اكتمال الاستجابة).

حدث: 'finish'

مضاف في: v0.3.6

يتم إصداره عندما يتم إرسال الاستجابة. على وجه التحديد، يتم إصدار هذا الحدث عندما يتم تسليم الجزء الأخير من رؤوس الاستجابة والجسم إلى نظام التشغيل للإرسال عبر الشبكة. لا يعني ذلك أن العميل قد تلقى أي شيء حتى الآن.

response.addTrailers(headers)

تمت الإضافة في: v0.3.0

تضيف هذه الطريقة عناوين HTTP المتأخرة (عنوان ولكن في نهاية الرسالة) إلى الاستجابة.

لن يتم إصدار العناوين المتأخرة إلا إذا تم استخدام ترميز مجزأ للاستجابة ؛ وإلا (مثلًا إذا كان الطلب HTTP/1.0) ، فسيتم تجاهلها بصمت.

يتطلب HTTP إرسال عنوان Trailer من أجل إصدار العناوين المتأخرة ، مع قائمة بمجالات العنوان في قيمته. على سبيل المثال:

js
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

تشير هذه الطريقة إلى الخادم بأن جميع عناوين الاستجابة والهيكل قد تم إرسالها ؛ يجب على الخادم أن يعتبر هذه الرسالة كاملة. يجب استدعاء الطريقة 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().

js
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

يُرجِع مصفوفة تحتوي على أسماء فريدة لعناوين الخرج الحالية. جميع أسماء العناوين صغيرة الحروف.

js
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

يُعيد نسخة سطحية من العناوين الصادرة الحالية. بما أنه يتم استخدام نسخة سطحية، يمكن تغيير قيم المصفوفة بدون مكالمات إضافية للعديد من طرق وحدة http ذات الصلة بالعنوان. مفاتيح الكائن المُرجَع هي أسماء العناوين والقيم هي قيم العناوين المُناظرة. جميع أسماء العناوين بحروف صغيرة.

الكائن الذي تُعيده طريقة response.getHeaders() لا يرث نموذجيًا من JavaScript Object. وهذا يعني أن طرق Object النموذجية مثل obj.toString(), obj.hasOwnProperty(), وغيرها ليست مُعرّفة ولن تعمل.

js
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 مُعيّن حاليًا في العناوين الصادرة. مطابقة اسم العنوان غير حساسة لحالة الأحرف.

js
const hasContentType = response.hasHeader('content-type')

response.headersSent

مضاف في: v0.9.3

قيمة منطقية (قراءة فقط). صحيح إذا تم إرسال العناوين، خطأ بخلاف ذلك.

response.removeHeader(name)

مضاف في: v0.4.0

يزيل عنوانًا مُنتظر إرساله ضمنيًا.

js
response.removeHeader('Content-Encoding')

response.req

مضاف في: v15.7.0

مرجع إلى كائن request HTTP الأصلي.

response.sendDate

مضاف في: v0.7.5

عندما يكون صحيحًا، سيتم إنشاء رأس التاريخ وتقديمه تلقائيًا في الاستجابة إذا لم يكن موجودًا بالفعل في الرؤوس. القيمة الافتراضية هي صحيح.

يجب تعطيل هذا فقط للاختبار؛ يتطلب HTTP رأس التاريخ في الاستجابات.

response.setHeader(name, value)

مضاف في: v0.4.0

يُعيد كائن الاستجابة.

يُعيّن قيمة رأس واحدة للقيم الضمنية للرؤوس. إذا كان هذا الرأس موجودًا بالفعل في الرؤوس المراد إرسالها، فسيتم استبدال قيمته. استخدم مصفوفة من السلاسل هنا لإرسال رؤوس متعددة بنفس الاسم. سيتم تخزين القيم غير السلسلة بدون تعديل. لذلك، قد يُعيد response.getHeader() قيمًا غير سلسلة. ومع ذلك، سيتم تحويل القيم غير السلسلة إلى سلاسل للنقل عبر الشبكة. يتم إرجاع كائن الاستجابة نفسه إلى المُستدعي، لتمكين سلسلة المكالمات.

js
response.setHeader('Content-Type', 'text/html')

أو

js
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript'])

إن محاولة تعيين اسم حقل رأس أو قيمة تحتوي على أحرف غير صالحة سيؤدي إلى طرح TypeError.

عندما يتم تعيين الرؤوس باستخدام response.setHeader()، سيتم دمجها مع أي رؤوس تم تمريرها إلى response.writeHead()، مع إعطاء الأولوية للرؤوس الممررة إلى response.writeHead().

js
// يُعيد 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. إذا تم توفير دالة مُراجعة، فسيتم إضافتها كمُستمع على حدث 'timeout' في كائن الاستجابة.

إذا لم يتم إضافة أي مُستمع 'timeout' إلى الطلب، أو الاستجابة، أو الخادم، فسيتم تدمير المقابس عند انتهاء مهلتها. إذا تم تعيين مُعالِج لأحداث 'timeout' للطلب، أو الاستجابة، أو الخادم، فيجب التعامل مع المقابس التي انتهت مهلتها بشكل صريح.

response.socket

مضاف في: v0.3.0

مرجع إلى المقبس الأساسي. عادةً ما لا يرغب المستخدمون في الوصول إلى هذه الخاصية. على وجه الخصوص، لن يُصدر المقبس أحداث 'readable' نظرًا لكيفية ارتباط مُحلل البروتوكول بالمقبس. بعد response.end()، يتم إلغاء الخاصية.

js
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)
js
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

عند استخدام الرؤوس الضمنية (عدم استدعاء response.writeHead() صراحةً)، تتحكم هذه الخاصية في رمز الحالة الذي سيتم إرساله إلى العميل عند تدفق الرؤوس.

js
response.statusCode = 404

بعد إرسال رأس الاستجابة إلى العميل، تشير هذه الخاصية إلى رمز الحالة الذي تم إرساله.

response.statusMessage

مُضاف في: v0.11.8

عند استخدام الرؤوس الضمنية (دون استدعاء response.writeHead() صراحةً)، تتحكم هذه الخاصية في رسالة الحالة التي سيتم إرسالها إلى العميل عند إفراغ الرؤوس. إذا تم تركها على أنها undefined، فسيتم استخدام الرسالة القياسية لرمز الحالة.

js
response.statusMessage = 'Not found'

بعد إرسال رأس الاستجابة إلى العميل، تشير هذه الخاصية إلى رسالة الحالة التي تم إرسالها.

response.strictContentLength

مُضاف في: v18.10.0، v16.18.0

إذا تم تعيينه على 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

إذا تم استدعاء هذه الطريقة ولم يتم استدعاء 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

يرسل رسالة HTTP/1.1 103 Early Hints إلى العميل مع رأس Link، مما يشير إلى أن وكيل المستخدم يمكنه تحميل/إعداد الموارد المرتبطة مسبقًا. hints هو كائن يحتوي على قيم الرؤوس المراد إرسالها مع رسالة التلميحات المبكرة. سيتم استدعاء الوسيطة الاختيارية callback عند كتابة رسالة الاستجابة.

مثال

js
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

يرسل رأس استجابة إلى الطلب. رمز الحالة هو رمز حالة HTTP مكون من 3 أرقام، مثل 404. الوسيطة الأخيرة، headers، هي رؤوس الاستجابة. اختياريًا، يمكن للمرء إعطاء statusMessage يمكن قراءته بواسطة الإنسان كوسيطة ثانية.

قد يكون headers مصفوفة حيث تكون المفاتيح والقيم في نفس القائمة. إنها ليست قائمة من الأزواج. لذلك، فإن الإزاحات ذات الأرقام الزوجية هي قيم المفاتيح، والإزاحات ذات الأرقام الفردية هي القيم المرتبطة. المصفوفة بنفس التنسيق مثل request.rawHeaders.

ترجع مرجعًا إلى ServerResponse، بحيث يمكن سلسلة المكالمات.

js
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() بدلاً من ذلك.

js
// 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

يتم إنشاء كائن 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

[مستقر: 0 - مُهمل]

مستقر: 0 الثبات: 0 - مُهمل. استمع إلى حدث 'close' بدلاً من ذلك.

يُصدر عندما يتم إيقاف الطلب.

الحدث: '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 كاملة وتحليلها بنجاح.

هذه الخاصية مفيدة بشكل خاص كوسيلة لتحديد ما إذا كان العميل أو الخادم قد أرسل رسالة كاملة قبل إنهاء الاتصال:

js
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

كائن رؤوس الطلب/الاستجابة.

أزواج مفتاح-قيمة لأسماء الرؤوس وقيمها. أسماء الرؤوس صغيرة الحروف.

js
// يطبع شيئًا مثل:
//
// { '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 ، ولكن لا يوجد منطق للربط، والقيم دائمًا عبارة عن مصفوفات من السلاسل، حتى بالنسبة للرؤوس التي تم استلامها مرة واحدة فقط.

js
// يطبع شيئًا مثل:
//
// { '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

قائمة رؤوس الطلب/الاستجابة الخام كما تم استلامها بالضبط.

المفاتيح والقيم في نفس القائمة. إنها ليست قائمة من الأزواج. لذلك، فإن الإزاحات ذات الأرقام الزوجية هي قيم المفاتيح، والإزاحات ذات الأرقام الفردية هي القيم المرتبطة.

أسماء الرؤوس ليست بحروف صغيرة، ولم يتم دمج المكررات.

js
// يطبع شيئًا مثل:
//
// [ '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

يطلق 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
new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`)

عندما يكون request.url هو '/status?name=ryan' و process.env.HOST غير معرف:

bash
$ 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

تُعد هذه الفئة بمثابة الفئة الأصلية لـ 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

يضيف مُلحقّات HTTP (عناوين ولكن في نهاية الرسالة) إلى الرسالة.

لن تُرسل المُلحقّات إلا إذا تم ترميز الرسالة بتقسيم. وإلا، فسيتم تجاهل المُلحقّات بصمت.

يُطلب من HTTP إرسال رأس Trailer لإرسال المُلحقّات، مع قائمة بأسماء حقول الرأس في قيمتها، على سبيل المثال:

js
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

يضيف قيمة رأس واحدة إلى كائن الرأس.

إذا كانت القيمة عبارة عن مصفوفة، فهذا ما يعادل استدعاء هذه الطريقة عدة مرات.

إذا لم تكن هناك قيم سابقة للرأس، فهذا ما يعادل استدعاء 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

  • error <Error> اختياري، خطأ لإصداره مع حدث error
  • عوائد: <this>

يدمر الرسالة. بمجرد ربط مقبس بالرسالة وتوصيله، سيتم تدمير هذا المقبس أيضًا.

outgoingMessage.end(chunk[, encoding][, callback])

[السجل]

الإصدارالتغييرات
v15.0.0يمكن أن يكون مُعامل chunk الآن Uint8Array.
v0.11.6إضافة وسيطة callback.
v0.1.90مضاف في: v0.1.90

ينهي الرسالة الصادرة. إذا كانت هناك أجزاء غير مرسلة من الجسم، فسوف يقوم بتفريغها إلى النظام الأساسي. إذا كانت الرسالة مجزأة، فسوف ترسل الجزء النهائي 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

يحصل على قيمة رأس HTTP باسم مُعطى. إذا لم يتم تعيين هذا الرأس، ستكون القيمة المُرجعَة undefined.

outgoingMessage.getHeaderNames()

مضاف في: v7.7.0

يرجع مصفوفة تحتوي على أسماء فريدة للرؤوس الصادرة الحالية. جميع الأسماء بحروف صغيرة.

outgoingMessage.getHeaders()

مضاف في: v7.7.0

  • القيمة المُرجعَة: <Object>

يرجع نسخة سطحية من الرؤوس الصادرة الحالية. نظرًا لاستخدام نسخة سطحية، يمكن تغيير قيم المصفوفة بدون مكالمات إضافية لطرق وحدة HTTP المتعلقة بالرأس. مفاتيح الكائن المُرجع هي أسماء الرؤوس والقيم هي قيم الرؤوس المُقابلة. جميع أسماء الرؤوس بحروف صغيرة.

لا يرث الكائن الذي تُرجعه طريقة outgoingMessage.getHeaders() نموذجيًا من JavaScript Object. هذا يعني أن طرق Object النموذجية مثل obj.toString()، obj.hasOwnProperty()، وغيرها ليست مُعرّفة ولن تعمل.

js
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 مُعيّن حاليًا في الرؤوس الصادرة. اسم الرأس غير حساس لحالة الأحرف.

js
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

يزيل رأسًا مُدرجًا في قائمة الانتظار للإرسال الضمني.

js
outgoingMessage.removeHeader('Content-Encoding')

outgoingMessage.setHeader(name, value)

تم الإضافة في: v0.4.0

يحدد قيمة رأس واحدة. إذا كان الرأس موجودًا بالفعل في الرؤوس المراد إرسالها، فسيتم استبدال قيمته. استخدم مصفوفة من السلاسل لإرسال رؤوس متعددة بنفس الاسم.

outgoingMessage.setHeaders(headers)

تم الإضافة في: v19.6.0، v18.15.0

يحدد قيم رؤوس متعددة للرؤوس الضمنية. يجب أن يكون headers مثيلًا لـ Headers أو Map، وإذا كان الرأس موجودًا بالفعل في الرؤوس المراد إرسالها، فسيتم استبدال قيمته.

js
const headers = new Headers({ foo: 'bar' })
outgoingMessage.setHeaders(headers)

أو

js
const headers = new Map([['foo', 'bar']])
outgoingMessage.setHeaders(headers)

عندما يتم تعيين الرؤوس باستخدام outgoingMessage.setHeaders()، سيتم دمجها مع أي رؤوس تم تمريرها إلى response.writeHead()، مع إعطاء الأولوية للرؤوس الممررة إلى response.writeHead().

js
// تُرجع 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

يرسل جزءًا من الجسم. يمكن استدعاء هذه الطريقة عدة مرات.

تُعتبر وسيطة 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'.

js
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)
js
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)
js
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)
js
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

بما أن معظم الطلبات هي طلبات GET بدون أجسام، فإن Node.js يوفر هذه الطريقة المريحة. والفرق الوحيد بين هذه الطريقة و http.request() هو أنها تضبط الطريقة على GET افتراضيًا وتُدعي req.end() تلقائيًا. يجب أن يهتم المُنعكس باستهلاك بيانات الاستجابة للأسباب المُوضحة في قسم http.ClientRequest.

يتم استدعاء callback بمعامل واحد وهو مثيل لـ http.IncomingMessage.

مثال جلب JSON:

js
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
  • url <سلسلة> | <URL>

  • 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.

js
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()
js
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:

js
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 <string>
  • label <string> تسمية لرسالة الخطأ. الافتراضي: 'Header name'.

يقوم بالتحقق من الصحة على مستوى منخفض للـ name المُقدّم، والذي يتم عند استدعاء res.setHeader(name, value).

سيؤدي تمرير قيمة غير قانونية كـ name إلى إرسال استثناء TypeError ، يتم تحديده بواسطة code: 'ERR_INVALID_HTTP_TOKEN'.

ليس من الضروري استخدام هذه الطريقة قبل تمرير العناوين إلى طلب أو استجابة HTTP. ستقوم وحدة HTTP تلقائيًا بالتحقق من صحة هذه العناوين.

مثال:

js
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 [""]'
}
js
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 تلقائيًا بالتحقق من صحة هذه العناوين.

أمثلة:

js
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"]'
}
js
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

تعيين الحد الأقصى لعدد محليّات تحليل HTTP الخاملة.

WebSocket

أضيف في: v22.5.0

تنفيذ متوافق مع المتصفح لـ WebSocket.