الفرق بين المراجعتين ل"Node.js/dns"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
 
(10 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الوحدة <code>‎‎‎DNS</code>‎ في Node.js}}</noinclude>
 
 
الاستقرار: 2-مستقر
 
الاستقرار: 2-مستقر
  
 
تحتوي الوحدة <code>dns</code> على دوال تخص فئتين مختلفتين هما:
 
تحتوي الوحدة <code>dns</code> على دوال تخص فئتين مختلفتين هما:
الدوال التي تستعمل خدمات نظام التشغيل الضمنية لتنفيذ عملية استبيان الاسم (name resolution)، والتي لا تتطلب بالضرورة تنفيذ أية عمليات اتصال بالشبكة. تحوي هذه الفئة على دالة وحيدة هي <code>dns.lookup()‎</code>. يتطلع المطورون إلى تنفيذ عملية استبيان الاسم بالطريقة نفسها التي تُنفِّذ فيها التطبيقات الأخرى الدالة <code>dns.lookup()‎</code> على المنصة ذاتها عندما تضطر إلى استعمالها.
+
*الدوال التي تستعمل خدمات نظام التشغيل الضمنية لتنفيذ عملية استبيان الاسم (name resolution)، والتي لا تتطلب بالضرورة تنفيذ أية عمليات اتصال بالشبكة. تحوي هذه الفئة على دالة وحيدة هي <code>[[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.lookup()‎]]</code>. يتطلع المطورون إلى تنفيذ عملية استبيان الاسم بالطريقة نفسها التي تُنفِّذ فيها التطبيقات الأخرى الدالة <code>[[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.lookup()]]‎</code> على المنصة ذاتها عندما تضطر إلى استعمالها. تفحَّص المثال التالي الذي يُستعمَل فيه الدالة <code>[[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.lookup()]]‎</code> للبحث عن <code>iana.org‎</code>:
تفحَّص المثال التالي الذي يُستعمَل فيه الدالة <code>dns.lookup()‎</code> للبحث عن <code>iana.org‎</code>:
+
<syntaxhighlight lang="javascript">const dns = require('dns');
<SYNTAXHIGHLIGHT LANG="javascript">const dns = require('dns');
 
  
 
dns.lookup('iana.org', (err, address, family) => {
 
dns.lookup('iana.org', (err, address, family) => {
سطر 12: سطر 10:
 
// address: "192.0.43.8" family: IPv4
 
// address: "192.0.43.8" family: IPv4
 
</syntaxhighlight>
 
</syntaxhighlight>
الدوال التي تتصل بخادم DNS حقيقي لتنفيذ عملية استبيان الاسم، والتي تستعمل دومًا الشكبة لتنفيذ استعلامات DNS. تتألف هذه الفئة من جميع الدوال الموجودة في الوحدة dns باستثناء الدالة <code>dns.lookup()‎</code>. لا تستعمل هذه الدوال مجموعة ملفات الضبط نفسها التي تستعملها الدالة <code>dns.lookup()‎</code> (مثل ‎/etc/hosts). يجب أن يستعمل هذه الدوال المطورون الذين لا يريدون أن يستخدموا خدمات نظام التشغيل الضمنية لاستبيان الاسم ولكن يريدون بدلًا من ذلك تنفيذ استعلامات DNS.
+
*الدوال التي تتصل بخادم DNS حقيقي لتنفيذ عملية استبيان الاسم، والتي تستعمل دومًا الشبكة لتنفيذ استعلامات DNS. تتألف هذه الفئة من جميع الدوال الموجودة في الوحدة <code>dns</code> باستثناء الدالة <code>[[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.lookup()]]‎</code>. لا تستعمل هذه الدوال مجموعة ملفات الضبط نفسها التي تستعملها الدالة <code>[[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.lookup()]]‎</code> (مثل ‎<code>/etc/hosts</code>). يجب أن يستعمل هذه الدوال المطورون الذين لا يريدون أن يستخدموا خدمات نظام التشغيل الضمنية لاستبيان الاسم ولكن يريدون بدلًا من ذلك تنفيذ استعلامات DNS.
يوضِّح المثال التالي كيفية الاستبيان عن <code>'archive.org'‎</code> ثم إعادة تنفيذ عملية الاستبيان بشكل عكسي على عناوين IP التي أعيدت:
+
<syntaxhighlight lang="javascript">const dns = require('dns');
<SYNTAXHIGHLIGHT LANG="javascript">const dns = require('dns');
 
  
 
dns.resolve4('archive.org', (err, addresses) => {
 
dns.resolve4('archive.org', (err, addresses) => {
سطر 30: سطر 27:
 
   });
 
   });
 
});
 
});
</syntaxhighlight>
+
</syntaxhighlight>هنالك عواقب خفية في اختيار إحدى الفئتين دون الأخرى، لذا ارجع رجاءً إلى قسم «اعتبارات التنفيذ» في الأسفل للمزيد من المعلومات.
هنالك عواقب خفية في اختيار إحدى الفئتين دون الأخرى، لذا ارجع رجاءً إلى قسم «اعتبارات التنفيذ» في الأسفل للمزيد من المعلومات.
+
==الصنف <code>dns.Resolver‎</code>==
== الصنف <code>dns.Resolver‎</code> ==
 
 
أضيف في الإصدار: v8.3.0.
 
أضيف في الإصدار: v8.3.0.
 +
 
يعدُّ الصنف <code>dns.Resolver‎‎</code> مستبيِن مستقل (independent resolver) من أجل طلبات DNS.
 
يعدُّ الصنف <code>dns.Resolver‎‎</code> مستبيِن مستقل (independent resolver) من أجل طلبات DNS.
انتبه إلى أنَّ المستبين المُنشَأ حديثًا يستعمل إعدادات الخادم الافتراضية. ضبط الخوادم المستعملة من أجل مستبين معيَّن عبر <code>resolver.setServers()‎</code> ليس له تأثير على مستبينات أخرى:
+
 
<SYNTAXHIGHLIGHT LANG="javascript">
+
انتبه إلى أنَّ المستبين المُنشَأ حديثًا يستعمل إعدادات الخادم الافتراضية. ضبط الخوادم المستعملة من أجل مستبين معيَّن عبر <code>[[Node.js/dns#dns.setServers.28servers.29.E2.80.8E|resolver.setServers()‎]]</code> ليس له تأثير على مستبينات أخرى:<syntaxhighlight lang="javascript">
 
const { Resolver } = require('dns');
 
const { Resolver } = require('dns');
 
const resolver = new Resolver();
 
const resolver = new Resolver();
سطر 45: سطر 42:
 
   // ...
 
   // ...
 
});
 
});
</syntaxhighlight>
+
</syntaxhighlight>التوابع التالية من الوحدة <code>dns</code> متاحةٌ حاليًا:
التوابع التالية من الوحدة dns متاحةٌ حاليًا:
+
*<code>[[Node.js/dns#dns.getServers.28.29.E2.80.8E|resolver.getServers()‎]]</code>
* resolver.getServers()‎</code>
+
*<code>[[Node.js/dns#dns.resolve.28hostname.5B.2C rrtype.5D.2C callback.29.E2.80.8E|resolver.resolve()‎]]</code>
* <code>resolver.resolve()‎</code>
+
*<code>[[Node.js/dns#dns.resolve4.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|resolver.resolve4()‎]]</code>
* <code>resolver.resolve4()‎</code>
+
*<code>[[Node.js/dns#dns.resolve6.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|resolver.resolve6()‎]]</code>
* <code>resolver.resolve6()‎</code>
+
*<code>[[Node.js/dns#dns.resolveAny.28hostname.2C callback.29.E2.80.8E|resolver.resolveAny()‎]]</code>
* <code>resolver.resolveAny()‎</code>
+
*<code>[[Node.js/dns#dns.resolveCname.28hostname.2C callback.29.E2.80.8E|resolver.resolveCname()‎]]</code>
* <code>resolver.resolveCname()‎</code>
+
*<code>[[Node.js/dns#dns.resolveMx.28hostname.29.E2.80.8E|resolver.resolveMx()‎]]</code>
* <code>resolver.resolveMx()‎</code>
+
*<code>[[Node.js/dns#dns.resolveNaptr.28hostname.2C callback.29.E2.80.8E|resolver.resolveNaptr()‎]]</code>
* <code>resolver.resolveNaptr()‎</code>
+
*<code>[[Node.js/dns#dns.resolveNs.28hostname.2C callback.29.E2.80.8E|resolver.resolveNs()‎]]</code>
* <code>resolver.resolveNs()‎</code>
+
*<code>[[Node.js/dns#dns.resolvePtr.28hostname.2C callback.29.E2.80.8E|resolver.resolvePtr()‎]]</code>
* <code>resolver.resolvePtr()‎</code>
+
*<code>[[Node.js/dns#dns.resolveSoa.28hostname.2C callback.29.E2.80.8E|resolver.resolveSoa()‎]]</code>
* <code>resolver.resolveSoa()‎</code>
+
*<code>[[Node.js/dns#dns.resolveSrv.28hostname.2C callback.29.E2.80.8E|resolver.resolveSrv()‎]]</code>
* <code>resolver.resolveSrv()‎</code>
+
*<code>[[Node.js/dns#dns.resolveTxt.28hostname.2C callback.29.E2.80.8E|resolver.resolveTxt()‎]]</code>
* <code>resolver.resolveTxt()‎</code>
+
*<code>[[Node.js/dns#dns.reverse.28ip.2C callback.29.E2.80.8E|resolver.reverse()‎]]</code>
* <code>resolver.reverse()‎</code>
+
*<code>[[Node.js/dns#dns.setServers.28servers.29.E2.80.8E|resolver.setServers()‎]]</code>
* <code>resolver.setServers()‎</code>
+
===<code>resolver.cancel()‎</code>===
=== <code>resolver.cancel()‎</code> ===
 
 
أضيف في الإصدار: v8.3.0.
 
أضيف في الإصدار: v8.3.0.
يلغي هذا التابع جميع استعلامات DNS المعلقة التي أنشأها هذا المستبين. ستُستدعَى دوال ردود النداء المقابلة مع خطأٍ رمزه ECANCELLED.
+
 
== <code>dns.getServers()‎</code> ==
+
يلغي هذا التابع جميع استعلامات DNS المعلقة التي أنشأها هذا المستبين. ستُستدعَى دوال ردود النداء المقابلة مع خطأٍ رمزه <code>ECANCELLED</code>.
 +
==<code>dns.getServers()‎</code>==
 
أضيف في الإصدار: v0.11.3.
 
أضيف في الإصدار: v0.11.3.
* القيم المعادة: [[JavaScript/String|<string[]‎>]]
+
*القيم المعادة: [[JavaScript/String|<string[]‎>]]
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار rtc5952، التي ضُبطَت آنذاك لتحليل DNS. ستتضمن السلسلة النصية جزءًا للمنفذ إن استخدم منفذ مخصص.
+
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار [[rfc:5952#section-6|rtc5952]]، التي ضُبطَت آنذاك لتحليل DNS. ستتضمن السلسلة النصية جزءًا للمنفذ إن استخدم منفذ مخصص.<syntaxhighlight lang="text">
<SYNTAXHIGHLIGHT LANG="text">
 
 
[
 
[
 
   '4.4.4.4',
 
   '4.4.4.4',
سطر 77: سطر 73:
 
]
 
]
 
</syntaxhighlight>
 
</syntaxhighlight>
== <code>dns.lookup(hostname[, options], callback)‎</code> ==
+
==<code>dns.lookup(hostname[, options], callback)‎</code>==
سجل التغييرات
+
{| class="wikitable mw-collapsible"
 +
|+سجل التغييرات
 +
!الإصدار
 +
!التغييرات
 +
|-
 +
|v1.2.0
 +
|أصبح الخيار <code>all</code> مدعومًا الآن.
 +
|-
 +
|v0.1.90
 +
|أضيف هذا التابع.
 +
|}
 +
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
 +
*<code>options‎</code>: ‏[[JavaScript/Number|<integer>]]‏ | [[JavaScript/Object|<Object>]]
 +
**<code>family‎</code>: ‏[[JavaScript/Number|<integer>]] عائلة السجل. يجب أن يأخذ القيمة 4 أو 6. يعاد العنوان IPv4 والعنوان IPv6 كلاهما افتراضيًّا.
 +
**<code>hints‎</code>: ‏[[JavaScript/Number|<number>]] واحدةٌ أو أكثر من الرايات <code>getaddrinfo‎</code> المدعومة. يمكن تمرير رايات متعددة عبر دمجها باستعمال المعامل OR الثنائي.
 +
**<code>all‎</code>: ‏‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته <code>true</code>، يعيد رد النداء جميع العناوين المستبينة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: <code>false</code>.
 +
**<code>verbatim‎</code>: ‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته <code>true</code>، يستقبل رد النداء العناوين IPv4 و IPv6 بالترتيب الذي أعاده بهم المستبين DNS. عندما تكون قيمته <code>false</code>، توضع العناوين IPv4 قبل عناوين IPv6. القيمة الافتراضية حاليًا هي: <code>false</code> (أي يعاد ترتيب العناوين)، ولكن يُتوقع أن تتغير في المستقبل القريب. يجب أن تستعمل الشيفرات الجديدة القيمة <code>{ verbatim: true }‎</code>.
 +
*<code>callback‎</code>: ‏[[JavaScript/Function|<Function>]]
 +
**<code>err‎</code>: ‏[[JavaScript/Error|<Error>]]
 +
**<code>address‎</code>: ‏[[JavaScript/String|<string>]] سلسلة نصية تمثل عناوين IPv4 أو IPv6.
 +
**<code>family</code>: ‏[[JavaScript/Number|<integer>]] عدد صحيح قيمته إما 4 أو 6 يدُّل على عائلة العنوان <code>address</code>.
 +
يستبين هذا التابع اسم المضيف (hostname) -مثل ‎<code>'nodejs.org'‎</code>- إلى أول سجل A (أي IPv4) أو AAAA (أي IPv6) يعثر عليه. إن كان الوسيط <code>options</code> عددًا صحيحًا، فيجب أن تكون قيمته 4 أو 6. أمَّا إن لم يُعطَ الوسيط <code>options</code>، فستُعاد العناوين IPv4 و IPv6 كلاهما حينئذٍ إن عُثِر عليها.
  
الإصدار
+
عند ضبط الخيار <code>all</code> إلى القيمة <code>true</code>، فستتغيَّر وسائط رد النداء <code>callback</code> إلى <code>(err, addresses)‎</code> مع جعل الوسيط <code>addresses</code> مصفوفةً من كائنات لها الخاصيتين <code>address</code> و <code>family</code>.
التغييرات
 
v1.2.0
 
أصبح الخيار all مدعومًا الآن.
 
v0.1.90
 
أضيف هذا التابع.
 
  
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
في حال حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>Error‎</code>، إذ يكون <code>err.code‎</code> هو رمز الخطأ. تذكر دومًا أنَّ <code>err.code‎</code> سيضبط إلى القيمة <code>'ENOENT'‎</code> ليس عندما لا يوجد اسم مضيف فقط ولكن عند فشل عملية البحث (lookup) أيضًا بطرق أخرى مثل عدم توافر واصفات للملف (file descriptors).
* <code>options‎</code>: ‏[[JavaScript/Number|<integer>]]‏ | [[JavaScript/Object|<Object>]]
+
 
** <code>family‎</code>: ‏[[JavaScript/Number|<integer>]] عائلة السجل. يجب أن يأخذ القيمة 4 أو 6. يعاد العنوان IPv4 والعنوان IPv6 كلاهما افتراضيًّا.
+
ليس بالضرورة أن تملك الدالة <code>dns.lookup()‎</code> كل شيء مطلوب للعمل مع البروتوكول DNS، إذ يستعمل التنفيذ خدمات نظام التشغيل التي تستطيع ربط الأسماء بالعناوين والعكس بالعكس. لهذا التنفيذ عواقب غامضة ولكن مهمة تؤثِّر على سلوك أي تطبيق من تطبيقات Node.js. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم «<nowiki/>[[Node.js/dns#.D8.A7.D8.B9.D8.AA.D8.A8.D8.A7.D8.B1.D8.A7.D8.AA .D8.A7.D9.84.D8.AA.D9.86.D9.81.D9.8A.D8.B0|اعتبارات التنفيذ]]» -في الأسفل- قبل استعمال التابع <code>dns.lookup()‎</code>.<syntaxhighlight lang="javascript">const dns = require('dns');
** <code>hints‎</code>: ‏[[JavaScript/Number|<number>]] واحدةٌ أو أكثر من الرايات <code>getaddrinfo‎</code> المدعومة. يمكن تمرير رايات متعددة عبر دمجها باستعمال المعامل OR الثنائي.
 
** <code>all‎</code>: ‏‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته true، يعيد رد النداء جميع العناوين المستبينة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: false.
 
** <code>verbatim‎</code>: ‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته true، يستقبل رد النداء العناوين IPv4 و IPv6 بالترتيب الذي أعاده بهم المستبين DNS. عندما تكون قيمته false، توضع العناوين IPv4 قبل عناوين IPv6. القيمة الافتراضية حاليًا هي: false (أي يعاد ترتيب العناوين)، ولكن يُتوقع أن تتغير في المستقبل القريب. يجب أن تستعمل الشيفرات الجديدة القيمة <code>{ verbatim: true }‎</code>.
 
* <code>callback‎</code>: ‏[[JavaScript/Function|<Function>]]
 
** <code>err‎</code>: ‏[[JavaScript/Error|<Error>]]
 
** <code>address‎</code>: ‏[[JavaScript/String|<string>]] سلسلة نصية تمثل عناوين IPv4 أو IPv6.
 
** <code>family</code>: ‏[[JavaScript/Number|<integer>]] عدد صحيح قيمته إما 4 أو 6 يدُّل على عائلة العنوان address.
 
يستبين هذا التابع اسم المضيف (hostname) -مثل <code>'nodejs.org'‎</code>- إلى أول سجل A (أي IPv4) أو AAAA (أي IPv6) يعثر عليه. إن كان الوسيط options عددًا صحيحًا، فيجب أن تكون قيمته 4 أو 6. أمَّا إن لم يُعطَ الوسيط options، فستُعاد العناوين IPv4 و IPv6 كلاهما حينئذٍ إن عُثِر عليها.
 
عند ضبط الخيار all إلى القيمة true، فستتغيَّر وسائط رد النداء callback إلى <code>(err, addresses)‎</code> مع جعل الوسيط addresses مصفوفةً من كائنات لها الخاصيتين address و family.
 
في حال حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>Error‎</code>، إذ يكون <code>err.code‎</code> هو رمز الخطأ. تذكر دومًا أنَّ <code>err.code‎</code> سيضبط إلى القيمة <code>'ENOENT'‎</code> ليس عندما لا يوجد اسم مضيف فقط ولكن عند فشل عملية البحث (lookup) أيضًا بطرق أخرى مثل عدم توافر واصفات للملف (file descriptors).
 
ليس بالضرورة أن تملك الدالة <code>dns.lookup()‎</code> كل شيء مطلوب للعمل مع البروتوكول DNS، إذ يستعمل التنفيذ خدمات نظام التشغيل التي تستطيع ربط الأسماء بالعناوين والعكس بالعكس. لهذا التنفيذ عواقب غامضة ولكن مهمة تؤثِّر على سلوك أي تطبيق من تطبيقات Node.js. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم «اعتبارات التنفيذ» -في الأسفل- قبل استعمال التابع <code>dns.lookup()‎</code>.
 
<SYNTAXHIGHLIGHT LANG="javascript">const dns = require('dns');
 
 
const options = {
 
const options = {
 
   family: 6,
 
   family: 6,
سطر 115: سطر 115:
 
   console.log('addresses: %j', addresses));
 
   console.log('addresses: %j', addresses));
 
// addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}]
 
// addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}]
</syntaxhighlight>
+
</syntaxhighlight>إن استدعي هذا التابع مثل نظيره <code>util.promisify()‎</code> ولم يُضبَط الوسيط <code>all</code> إلى القيمة <code>true</code>، فسيُعيد كائنًا من النوع <code>Promise</code> لكائن <code>Object‎</code> مع الخاصيتين <code>address‎</code> و <code>family</code>.
إن استدعي هذا التابع مثل نظيره <code>util.promisify()‎</code> ولم يُضبَط الوسيط all إلى القيمة true، فسيُعيد كائنًا من النوع Promise لكائن <code>Object‎</code> مع الخاصيتين <code>address‎</code> و <code>family<code>.
+
===الرايات <code>getaddrinfo‎</code> المدعومة===
=== الرايات <code>getaddrinfo‎</code> المدعومة ===
 
 
يمكن استعمال الرايات التالية مع الوسيط <code>hints‎</code> الممرر إلى التابع <code>dns.lookup()‎</code>:
 
يمكن استعمال الرايات التالية مع الوسيط <code>hints‎</code> الممرر إلى التابع <code>dns.lookup()‎</code>:
* <code>dns.ADDRCONFIG‎</code>: تحدِّد أنواع العناوين المعادة عبر أنواع العناوين المدعومة من قِبَل النظام الحالي. على سبيل المثال، تعاد العناوين IPv4 فقط إن كان النظام الحالي يملك عنوان IPv4 واحد مضبوط على الأقل. لا تؤخذ العناوين loopback بالحسبان.
+
*<code>dns.ADDRCONFIG‎</code>: تحدِّد أنواع العناوين المعادة عبر أنواع العناوين المدعومة من قِبَل النظام الحالي. على سبيل المثال، تعاد العناوين IPv4 فقط إن كان النظام الحالي يملك عنوان IPv4 واحد مضبوط على الأقل. لا تؤخذ العناوين loopback بالحسبان.
* <code>dns.V4MAPPED‎</code>: إن حُدِّدت عائلة العناوين IPv6 ولكن لم يُعثَر على عناوين IPv6، فستُعاد حينئذٍ العناوين IPv4 بعد تعيينها إلى عناوين IPv6. انتبه إلى أنَّ هذه الراية غير مدعومة على بعض أنظمة التشغيل (مثل FreeBSD 10.1).
+
*<code>dns.V4MAPPED‎</code>: إن حُدِّدت عائلة العناوين IPv6 ولكن لم يُعثَر على عناوين IPv6، فستُعاد حينئذٍ العناوين IPv4 بعد تعيينها إلى عناوين IPv6. انتبه إلى أنَّ هذه الراية غير مدعومة على بعض أنظمة التشغيل (مثل FreeBSD 10.1).
== <code>dns.lookupService(address, port, callback)‎</code> ==
+
==<code>dns.lookupService(address, port, callback)‎</code>==
 
أضيف في الإصدار: 0.11.14.
 
أضيف في الإصدار: 0.11.14.
* <code>address‎</code>: ‏[[JavaScript/String|<string>]]
+
*<code>address‎</code>: ‏[[JavaScript/String|<string>]]
* <code>‎port</code>: ‏[[JavaScript/Number|<number>]]
+
*<code>‎port</code>: ‏[[JavaScript/Number|<number>]]
* <code>callback‎</code>: ‏[[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>: ‏[[JavaScript/Function|<Function>]]
** <code>err‎</code>: ‏[[JavaScript/Error|<Error>]]
+
**<code>err‎</code>: ‏[[JavaScript/Error|<Error>]]
** <code>hostname‎</code>: ‏[[JavaScript/String|<string>]] مثل <code>example.com‎</code>.  
+
**<code>hostname‎</code>: ‏[[JavaScript/String|<string>]] مثل <code>example.com‎</code>.
** <code>service‎</code>: ‏[[JavaScript/String|<string>]] مثل <code>http‎</code>.
+
**<code>service‎</code>: ‏[[JavaScript/String|<string>]] مثل <code>http‎</code>.
يستبين هذا التابع العنوان <code>address<code> والمنفذ <code>port‎</code> المعطى إلى اسم مضيف (hostname) وخدمة (service) باستعمال التنفيذ <code>getnameinfo‎</code> الضمني لنظام التشغيل.
+
يستبين هذا التابع العنوان <code>address</code> والمنفذ <code>port‎</code> المعطى إلى اسم مضيف (hostname) وخدمة (service) باستعمال التنفيذ <code>getnameinfo‎</code> الضمني لنظام التشغيل. إن لم يكن الوسيط <code>address‎</code> عنوان IP صالح، فسيُرمَى الخطأ <code>TypeError‎</code>. سيحوَّل المنفذ <code>port‎</code> إلى عدد رغمًا عنه؛ فإن لم يكن منفذًا مقبولًا، فسيُرمى الخطأ <code>[[JavaScript/TypeError|TypeError‎]]</code>. في حال حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>Error‎</code>، إذ يكون <code>err.code‎</code> هو رمز الخطأ.<syntaxhighlight lang="javascript">const dns = require('dns');
إن لم يكن الوسيط <code>address‎</code> عنوان IP صالح، فسيُرمَى الخطأ <code>TypeError‎</code>. سيحوَّل المنفذ <code>port‎</code> إلى عدد رغمًا عنه؛ فإن لم يكن منفذًا مقبولًا، فسيُرمى الخطأ <code>TypeError‎</code>.
 
في حال حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>Error‎</code>، إذ يكون <code>err.code‎</code> هو رمز الخطأ.
 
<SYNTAXHIGHLIGHT LANG="javascript">const dns = require('dns');
 
 
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
 
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
 
   console.log(hostname, service);
 
   console.log(hostname, service);
 
   // localhost ssh :سيُطبع
 
   // localhost ssh :سيُطبع
 
});
 
});
</syntaxhighlight>
+
</syntaxhighlight>إن استدعي هذا التابع مثل نظيره <code>util.promisify()‎</code>، فسيعيد كائنًا من النوع <code>[[JavaScript/Promise|Promise]]</code> للكائن <code>[[JavaScript/Object|Object‎]]</code> مع الخاصيتين <code>address‎</code> و <code>family</code>.
إن استدعي هذا التابع مثل نظيره <code>util.promisify()‎</code>، فسيعيد كائنًا من النوع Promise للكائن <code>Object‎</code> مع الخاصيتين <code>address‎</code> و <code>family</code>.
+
==<code>dns.resolve(hostname[, rrtype], callback)‎</code>==
== <code>dns.resolve(hostname[, rrtype], callback)‎</code> ==
 
 
أضيف في الإصدار: v0.1.27.
 
أضيف في الإصدار: v0.1.27.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
* <code>rrtype‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>rrtype‎</code>:‏ [[JavaScript/String|<string>]]
* <code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err‎</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err‎</code>:‏ [[JavaScript/Error|<Error>]]
** <code>records‎</code>:‏ [[JavaScript/String|<string[]‎>]]‏ | [[JavaScript/Object|<Object[]‎>]]‏ | [[JavaScript/Object|<Object>]]
+
**<code>records‎</code>:‏ [[JavaScript/String|<string[]‎>]]‏ | [[JavaScript/Object|<Object[]‎>]]‏ | [[JavaScript/Object|<Object>]]
 
يستعمل هذا التابع بروتوكول DNS للاستبيان عن اسم مضيف (مثل <code>'nodejs.org'‎</code>) إلى مصفوفة من سجلات المصدر (resource records). يُمرَّر إلى الدالة <code>callback‎</code> الوسيطين <code>err‎</code> و <code>records‎</code>. عند نجاح العملية، سيكون <code>records‎</code> مصفوفةً من سجلات المصدر. يختلف نوع وبنية النتائج الفردية التي نحصل عليها بناءً على قيمة الوسيط <code>rrtype‎</code> وهي:
 
يستعمل هذا التابع بروتوكول DNS للاستبيان عن اسم مضيف (مثل <code>'nodejs.org'‎</code>) إلى مصفوفة من سجلات المصدر (resource records). يُمرَّر إلى الدالة <code>callback‎</code> الوسيطين <code>err‎</code> و <code>records‎</code>. عند نجاح العملية، سيكون <code>records‎</code> مصفوفةً من سجلات المصدر. يختلف نوع وبنية النتائج الفردية التي نحصل عليها بناءً على قيمة الوسيط <code>rrtype‎</code> وهي:
 
+
{| class="wikitable"
rrtype
+
!<code>rrtype</code>
محتويات records
+
!محتويات السجلات <code>records</code>
نوع النتيجة
+
!نوع النتيجة
التابع المختصر المقابل
+
!التابع المختصر المقابل
'A'
+
|-
عناوين IPv4 (القيمة الافتراضية).
+
|<code>'A'</code>
<string>
+
|عناوين IPv4 (القيمة الافتراضية).
dns.resolve4()
+
|[[JavaScript/String|<string>]]
'AAAA'
+
|<code>[[Node.js/dns#dns.resolve4.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.resolve4()‎]]</code>
عناوين IPv6.
+
|-
<string>
+
|<code>'AAAA'</code>
dns.resolve6()
+
|عناوين IPv6.
'ANY'
+
|[[JavaScript/String|<string>]]
أية سجلات.
+
|<code>[[Node.js/dns#dns.resolve6.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.resolve6()‎]]</code>
<Object>
+
|-
dns.resolveAny()
+
|<code>'ANY'</code>
'CNAME'
+
|أية سجلات.
سجلات الاسم المعياري (canonical name records).
+
|[[JavaScript/Object|<Object>]]
<string>
+
|<code>[[Node.js/dns#dns.resolveAny.28hostname.2C callback.29.E2.80.8E|resolver.resolveAny()‎]]</code>
dns.resolveCname()
+
|-
'MX'
+
|<code>'CNAME'</code>
سجلات تبادل البريد (mail exchange records).
+
|سجلات الاسم المعياري (canonical name records).
<Object>
+
|[[JavaScript/String|<string>]]
dns.resolveMx()
+
|<code>[[Node.js/dns#dns.resolveCname.28hostname.2C callback.29.E2.80.8E|dns.resolveCname()‎]]</code>
'NAPTR'
+
|-
سجلات مؤشر اسم التفويض (name authority pointer records).
+
|<code>'MX'</code>
<Object>
+
|سجلات تبادل البريد (mail exchange records).
dns.resolveNaptr()
+
|[[JavaScript/Object|<Object>]]
'NS'
+
|<code>[[Node.js/dns#dns.resolveMx.28hostname.29.E2.80.8E|resolver.resolveMx()‎]]</code>
سجلات خادم الأسماء (Name Server).
+
|-
<string>
+
|<code>'NAPTR'</code>
dns.resolveNs()
+
|سجلات مؤشر اسم التفويض (name authority pointer records).
'PTR'
+
|[[JavaScript/Object|<Object>]]
سجلات المؤشر (pointer records).
+
|<code>[[Node.js/dns#dns.resolveNaptr.28hostname.2C callback.29.E2.80.8E|dns.resolveNaptr()‎]]</code>
<string>
+
|-
dns.resolvePtr()
+
|<code>'NS'</code>
'SOA'
+
|سجلات خادم الأسماء (Name Server).
بداية سجلات التفويض (authority records).
+
|[[JavaScript/String|<string>]]
<Object>
+
|<code>[[Node.js/dns#dns.resolveNs.28hostname.2C callback.29.E2.80.8E|dns.resolveNs()‎]]</code>
dns.resolveSoa()
+
|-
'SRV'
+
|<code>'PTR'</code>
سجلات خدمة (service records).
+
|سجلات المؤشر (pointer records).
<Object>
+
|[[JavaScript/String|<string>]]
dns.resolveSrv()
+
|<code>[[Node.js/dns#dns.resolvePtr.28hostname.2C callback.29.E2.80.8E|dns.resolvePtr()‎]]</code>
'TXT'
+
|-
سجلات نصية (text records).
+
|<code>'SOA'</code>
[[JavaScript/String|<string[]‎>]]
+
|بداية سجلات التفويض  (authority records).
dns.resolveTxt()
+
|[[JavaScript/Object|<Object>]]
 
+
|<code>[[Node.js/dns#dns.resolveSoa.28hostname.2C callback.29.E2.80.8E|dns.resolveSoa()‎]]</code>
 
+
|-
 
+
|<code>'SRV'</code>
في حال حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>Error‎</code>، إذ يعدُّ <code>err.code‎</code> أحد رموز الخطأ في DNS.
+
|سجلات خدمة (service records).
== <code>dns.resolve4(hostname[, options], callback)‎</code> ==
+
|[[JavaScript/Object|<Object>]]
سجل التغييرات
+
|<code>[[Node.js/dns#dns.resolveSrv.28hostname.2C callback.29.E2.80.8E|dns.resolveSrv()‎]]</code>
 
+
|-
الإصدار
+
|<code>'TXT'</code>
التغييرات
+
|سجلات نصية (text records).
v7.2.0
+
|[[JavaScript/String|<string[]‎>]]
أصبح هذا التابع يدعم تمرير الوسيط <code>options‎</code> خصوصًا <code>options.ttl‎</code>.
+
|<code>[[Node.js/dns#dns.resolveTxt.28hostname.2C callback.29.E2.80.8E|dns.resolveTxt()‎]]</code>
v0.1.16
+
|}
أضيف هذا التابع.
+
في حال حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>[[JavaScript/Error|Error‎]]</code>، إذ يعدُّ <code>err.code‎</code> أحد رموز الخطأ في DNS.
 
+
==<code>dns.resolve4(hostname[, options], callback)‎</code>==
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
{| class="wikitable mw-collapsible"
* <code>options</code>:‏ [[JavaScript/Object|<Object>]]
+
|+سجل التغييرات
** <code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، تستقبل دالة رد النداء مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
+
!الإصدار
* <code>callback</code>:‏ [[JavaScript/Function|<Function>]]
+
!التغييرات
** <code>err</code>:‏  [[JavaScript/Error|<Error>]]
+
|-
** <code>addresses</code>:‏ [[JavaScript/String|<string[]‎>]]‏ | [[JavaScript/Object|<Object[]‎>]]
+
|v7.2.0
 +
|أصبح هذا التابع يدعم تمرير الوسيط <code>options‎</code> خصوصًا <code>options.ttl</code>.
 +
|-
 +
|v0.1.16
 +
|أضيف هذا التابع.
 +
|}
 +
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
 +
*<code>options</code>:‏ [[JavaScript/Object|<Object>]]
 +
**<code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، تستقبل دالة رد النداء مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
 +
*<code>callback</code>:‏ [[JavaScript/Function|<Function>]]
 +
**<code>err</code>:‏  [[JavaScript/Error|<Error>]]
 +
**<code>addresses</code>:‏ [[JavaScript/String|<string[]‎>]]‏ | [[JavaScript/Object|<Object[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv4 (سجلات 'A') من أجل اسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses‎</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من عناوين IPv4 (مثل <code>['74.125.79.104', '74.125.79.105', '74.125.79.106']‎</code>).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv4 (سجلات 'A') من أجل اسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses‎</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من عناوين IPv4 (مثل <code>['74.125.79.104', '74.125.79.105', '74.125.79.106']‎</code>).
== <code>dns.resolve6(hostname[, options], callback)‎</code> ==
+
==<code>dns.resolve6(hostname[, options], callback)‎</code>==
سجل التغييرات
+
{| class="wikitable mw-collapsible"
 
+
|+سجل التغييرات
الإصدار
+
!الإصدار
التغييرات
+
!التغييرات
v7.2.0
+
|-
أصبح هذا التابع يدعم تمرير الوسيط <code>options‎</code> خصوصًا <code>options.ttl‎</code>.
+
|v7.2.0
v0.1.16
+
|أصبح هذا التابع يدعم تمرير الوسيط <code>options‎</code> خصوصًا <code>options.ttl</code>.
أضيف هذا التابع.
+
|-
 
+
|v0.1.16
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
|أضيف هذا التابع.
* <code>options</code>:‏ [[JavaScript/Object|<Object>]]
+
|}
** <code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، تستقبل دالة رد النداء مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
* <code>callback</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>options</code>:‏ [[JavaScript/Object|<Object>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، تستقبل دالة رد النداء مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
** <code>addresses</code>:‏ [[JavaScript/String|<string[]‎>]]‏ | [[JavaScript/Object|<Object[]‎>]]
+
*<code>callback</code>:‏ [[JavaScript/Function|<Function>]]
 +
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
 +
**<code>addresses</code>:‏ [[JavaScript/String|<string[]‎>]]‏ | [[JavaScript/Object|<Object[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv6 (سجلات 'AAAA') من أجل اسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses‎</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من عناوين IPv6.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv6 (سجلات 'AAAA') من أجل اسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses‎</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من عناوين IPv6.
== <code>dns.resolveAny(hostname, callback)‎</code> ==
+
==<code>dns.resolveAny(hostname, callback)‎</code>==
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
* <code>callback</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses</code>:‏ [[JavaScript/Object|<Object[]‎>]]
+
**<code>addresses</code>:‏ [[JavaScript/Object|<Object[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان جميع السجلات (يُعرَف أيضًا بأنه استعلام <code>ANY‎</code> أو <code>*‎</code>). سيحوي الوسيط <code>ret</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً تحتوي على مختلف أنواع السجلات. يملك كل سجل الخاصية <code>type‎</code> التي تشير إلى نوع السجل الحالي. وبناءً على قيمة <code>type‎</code>، ستُعرَض خاصيات إضافية في الكائن هي:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان جميع السجلات (يُعرَف أيضًا بأنه استعلام <code>ANY‎</code> أو <code>*‎</code>). سيحوي الوسيط <code>ret</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً تحتوي على مختلف أنواع السجلات. يملك كل سجل الخاصية <code>type‎</code> التي تشير إلى نوع السجل الحالي. وبناءً على قيمة <code>type‎</code>، ستُعرَض خاصيات إضافية في الكائن هي:
 
+
{| class="wikitable"
النوع
+
!النوع
الخاصيات
+
!الخاصيات
'A'
+
|-
address/ttl
+
|<code>'A'</code>
'AAAA'
+
|<code>address/ttl</code>
address/ttl
+
|-
'CNAME'
+
|<code>'AAAA'</code>
value
+
|<code>address/ttl</code>
'MX'
+
|-
تشير إلى التابع dns.resolveMx()‎.
+
|<code>'CNAME'</code>
'NAPTR'
+
|<code>value</code>
تشير إلى التابع dns.resolveNaptr()‎.
+
|-
'NS'
+
|<code>'MX'</code>
value
+
|تشير إلى التابع <code>[[Node.js/dns#dns.resolveMx.28hostname.29.E2.80.8E|dns.resolveMx()‎]]</code>.
'PTR'
+
|-
value
+
|<code>'NAPTR'</code>
'SOA'
+
|تشير إلى التابع <code>[[Node.js/dns#dns.resolveNaptr.28hostname.2C callback.29.E2.80.8E|dns.resolveNaptr()‎]]</code>‎.
تشير إلى التابع dns.resolveSoa()‎.
+
|-
'SRV'
+
|<code>'NS'</code>
تشير إلى التابع dns.resolveSrv()‎.
+
|<code>value</code>
'TXT'
+
|-
يحتوي هذا النوع من السجل على خاصية مصفوفة تدعى entries تشير إلى dns.resolveTxt()‎ مثل { entries: ['...'], type: 'TXT' }.
+
|<code>'PTR'</code>
 
+
|<code>value</code>
لدينا مثالٌ عن تمرير الكائن <code>ret‎</code> إلى دالة رد النداء:
+
|-
<SYNTAXHIGHLIGHT LANG="javascript">[ { type: 'A', address: '127.0.0.1', ttl: 299 },
+
|<code>'SOA'</code>
 +
|تشير إلى التابع <code>[[Node.js/dns#dns.resolveSoa.28hostname.2C callback.29.E2.80.8E|dns.resolveSoa()‎]]</code>‎.
 +
|-
 +
|<code>'SRV'</code>
 +
|تشير إلى التابع <code>[[Node.js/dns#dns.resolveSrv.28hostname.2C callback.29.E2.80.8E|dns.resolveSrv()‎]]</code>.
 +
|-
 +
|<code>'TXT'</code>
 +
|يحتوي هذا النوع من السجل على خاصية مصفوفة تدعى <code>entries</code> تشير إلى <code>[[Node.js/dns#dns.resolveTxt.28hostname.2C callback.29.E2.80.8E|dns.resolveTxt()‎]]</code> مثل <code>{ entries: ['...'], type: 'TXT' }</code>.
 +
|}
 +
لدينا مثالٌ عن تمرير الكائن <code>ret‎</code> إلى دالة رد النداء:<syntaxhighlight lang="javascript">[ { type: 'A', address: '127.0.0.1', ttl: 299 },
 
   { type: 'CNAME', value: 'example.com' },
 
   { type: 'CNAME', value: 'example.com' },
 
   { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 },
 
   { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 },
سطر 277: سطر 294:
 
     retry: 900,
 
     retry: 900,
 
     expire: 1800,
 
     expire: 1800,
     minttl: 60 } ]</syntaxhighlight>  
+
     minttl: 60 } ]</syntaxhighlight>
== <code>dns.resolveCname(hostname, callback)‎</code> ==
+
==<code>dns.resolveCname(hostname, callback)‎</code>==
 
أضيف في الإصدار: v0.3.2.
 
أضيف في الإصدار: v0.3.2.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
* <code>callback</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses</code>:‏ [[JavaScript/Object|<Object[]‎>]]
+
**<code>addresses</code>:‏ [[JavaScript/Object|<Object[]‎>]]
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات <code>MX‎</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من الكائنات التي تحتوي على الخاصية <code>priority‎</code> والخاصية <code>exchange‎</code> (مثل  <code>[{priority: 10, exchange: 'mx.example.com'}, ...]‎</code>)
+
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات <code>MX‎</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من الكائنات التي تحتوي على الخاصية <code>priority‎</code> والخاصية <code>exchange‎</code> (مثل  <code>[{priority: 10, exchange: 'mx.example.com'}, ...]‎</code>).
== <code>dns.resolveNaptr(hostname, callback)‎</code> ==
+
==<code>dns.resolveMx(hostname)‎</code>==
 +
أضيف في الإصدار: v10.6.0.
 +
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
 +
*<code>callback</code>:‏ [[JavaScript/Function|<Function>]]
 +
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
 +
**<code>addresses</code>:‏ [[JavaScript/Object|<Object[]‎>]]
 +
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات <code>MX‎</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من الكائنات التي تحتوي على الخاصية <code>priority‎</code> والخاصية <code>exchange‎</code> (مثل <code>[{priority: 10, exchange: 'mx.example.com'}, ...]‎</code>).
 +
==<code>dns.resolveNaptr(hostname, callback)‎</code>==
 
أضيف في الإصدار: v0.9.12.
 
أضيف في الإصدار: v0.9.12.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
* <code>callback</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses</code>:‏ [[JavaScript/Object|<Object[]‎>]]
+
**<code>addresses</code>:‏ [[JavaScript/Object|<Object[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان السجلات القائمة على تعابير نمطية (سجلات <code>NAPTR</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من كائناتٍ لها الخاصيات التالية:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان السجلات القائمة على تعابير نمطية (سجلات <code>NAPTR</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من كائناتٍ لها الخاصيات التالية:
* <code>flags‎</code>  
+
*<code>flags‎</code>
* <code>service</code>  
+
*<code>service</code>
* <code>regexp</code>  
+
*<code>regexp</code>
* <code>replacement</code>  
+
*<code>replacement</code>
* <code>order</code>  
+
*<code>order</code>
* <code>preference</code>  
+
*<code>preference</code>
<SYNTAXHIGHLIGHT LANG="javascript">{
+
<syntaxhighlight lang="javascript">{
 
   flags: 's',
 
   flags: 's',
 
   service: 'SIP+D2U',
 
   service: 'SIP+D2U',
سطر 306: سطر 330:
 
   preference: 100
 
   preference: 100
 
}
 
}
</syntaxhighlight>  
+
</syntaxhighlight>
== <code>dns.resolveNs(hostname, callback)‎</code> ==
+
==<code>dns.resolveNs(hostname, callback)‎</code>==
 
أضيف في الإصدار: v0.1.90.
 
أضيف في الإصدار: v0.1.90.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
* <code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses‎</code>:‏ [[JavaScript/String|<string[]‎>]]
+
**<code>addresses‎</code>:‏ [[JavaScript/String|<string[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات <code>NS‎</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف  <code>hostname‎</code> (مثل <code>['ns1.example.com', 'ns2.example.com']‎</code>).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات <code>NS‎</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف  <code>hostname‎</code> (مثل <code>['ns1.example.com', 'ns2.example.com']‎</code>).
== <code>dns.resolvePtr(hostname, callback)‎</code> ==
+
==<code>dns.resolvePtr(hostname, callback)‎</code>==
 
أضيف في الإصدار: v6.0.0.
 
أضيف في الإصدار: v6.0.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
* <code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses‎</code>:‏ [[JavaScript/String|<string[]‎>]]
+
**<code>addresses‎</code>:‏ [[JavaScript/String|<string[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات <code>PTR</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من السلاسل النصية التي تحتوي على سجلات الرد (reply records).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات <code>PTR</code>) لاسم المضيف <code>hostname‎</code>. سيحوي الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> مصفوفةً من السلاسل النصية التي تحتوي على سجلات الرد (reply records).
== <code>dns.resolveSoa(hostname, callback)‎</code> ==
+
==<code>dns.resolveSoa(hostname, callback)‎</code>==
 
أضيف في الإصدار: v0.11.10.
 
أضيف في الإصدار: v0.11.10.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
* <code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses‎</code>:‏ [[JavaScript/Object|<Object>]]
+
**<code>addresses‎</code>:‏ [[JavaScript/Object|<Object>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان بداية سجل التفويض (سجل <code>SOA</code>) لاسم المضيف <code>hostname‎</code>. الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> هو كائنٌ يملك الخاصيات التالية:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان بداية سجل التفويض (سجل <code>SOA</code>) لاسم المضيف <code>hostname‎</code>. الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> هو كائنٌ يملك الخاصيات التالية:
* <code>nsname‎</code>
+
*<code>nsname‎</code>
* <code>hostmaster‎</code>
+
*<code>hostmaster‎</code>
* <code>serial‎</code>
+
*<code>serial‎</code>
* <code>refresh‎</code>
+
*<code>refresh‎</code>
* <code>retry‎</code>
+
*<code>retry‎</code>
* <code>expire‎</code>
+
*<code>expire‎</code>
* <code>minttl‎</code>
+
*<code>minttl‎</code>
<SYNTAXHIGHLIGHT LANG="javascript">{
+
<syntaxhighlight lang="javascript">{
 
   nsname: 'ns.example.com',
 
   nsname: 'ns.example.com',
 
   hostmaster: 'root.example.com',
 
   hostmaster: 'root.example.com',
سطر 345: سطر 369:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
== <code>dns.resolveSrv(hostname, callback)‎</code> ==
+
==<code>dns.resolveSrv(hostname, callback)‎</code>==
 
أضيف في الإصدار: v0.1.27.
 
أضيف في الإصدار: v0.1.27.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
* <code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses‎</code>:‏ [[JavaScript/Object|<Object[]‎>]]
+
**<code>addresses‎</code>:‏ [[JavaScript/Object|<Object[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات خدمة (سجلات <code>SRV</code>) لاسم المضيف <code>hostname‎</code>. الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> هو مصفوفة من كائنات تمتلك الخاصيات التالية:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات خدمة (سجلات <code>SRV</code>) لاسم المضيف <code>hostname‎</code>. الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> هو مصفوفة من كائنات تمتلك الخاصيات التالية:
* <code>priority</code>
+
*<code>priority</code>
* <code>weight</code>
+
*<code>weight</code>
* <code>port</code>
+
*<code>port</code>
* <code>name</code>
+
*<code>name</code>
 
<syntaxhighlight lang="javascript">  
 
<syntaxhighlight lang="javascript">  
 
{
 
{
سطر 363: سطر 387:
 
   name: 'service.example.com'
 
   name: 'service.example.com'
 
}
 
}
</syntaxhighlight>  
+
</syntaxhighlight>
== <code>dns.resolveTxt(hostname, callback)‎</code> ==
+
==<code>dns.resolveTxt(hostname, callback)‎</code>==
 
أضيف في الإصدار: v0.1.27.
 
أضيف في الإصدار: v0.1.27.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
* <code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses‎</code>:‏ [[JavaScript/Object|<Object[]‎>]]
+
**<code>addresses‎</code>:‏ [[JavaScript/Object|<Object[]‎>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات <code>TXT</code>) لاسم المضيف <code>hostname‎</code>. الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> هو مصفوفة ثنائية البعد من سجلات نصية لاسم المضيف <code>hostname‎</code> (مثل <code>[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]‎</code>). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات <code>TXT</code>) لاسم المضيف <code>hostname‎</code>. الوسيط <code>addresses</code> المُمرَّر إلى الدالة <code>callback‎</code> هو مصفوفة ثنائية البعد من سجلات نصية لاسم المضيف <code>hostname‎</code> (مثل <code>[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]‎</code>). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.
== <code>dns.reverse(ip, callback)‎</code> ==
+
==<code>dns.reverse(ip, callback)‎</code>==
 
أضيف في الإصدار: 0.1.16.
 
أضيف في الإصدار: 0.1.16.
* <code>ip</code>:‏ [[JavaScript/String|<string>]]
+
*<code>ip</code>:‏ [[JavaScript/String|<string>]]
* <code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
+
*<code>callback‎</code>:‏ [[JavaScript/Function|<Function>]]
** <code>err</code>:‏ [[JavaScript/Error|<Error>]]
+
**<code>err</code>:‏ [[JavaScript/Error|<Error>]]
** <code>addresses‎</code>:‏ [[JavaScript/String|<string[]‎>]]
+
**<code>addresses‎</code>:‏ [[JavaScript/String|<string[]‎>]]
 
ينفِّذ هذا التابع تعليمة DNS بشكل عكسي لاستبيان عناوين IPv4 أو IPv6 إلى مصفوفة من أسماء المضيفين.
 
ينفِّذ هذا التابع تعليمة DNS بشكل عكسي لاستبيان عناوين IPv4 أو IPv6 إلى مصفوفة من أسماء المضيفين.
 +
 
عند حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>Error‎</code>، إذ يعدُّ <code>err.code‎</code> واحدًا من رموز الخطأ في DNS.
 
عند حصول خطأ، يكون الوسيط <code>err‎</code> كائنًا من النوع <code>Error‎</code>، إذ يعدُّ <code>err.code‎</code> واحدًا من رموز الخطأ في DNS.
== <code>dns.setServers(servers)‎</code> ==
+
==<code>dns.setServers(servers)‎</code>==
 
أضيف في الإصدار: v0.11.3.
 
أضيف في الإصدار: v0.11.3.
* <code>servers‎</code>:‏ [[JavaScript/String|<string[]‎>]] مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار rfc5952.
+
*<code>servers‎</code>:‏ [[JavaScript/String|<string[]‎>]] مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار rfc5952.
يضبط هذا التابع العناوين IP ومنافذ الخوادم لاستعمالها عند تنفيذ استبيان DNS. الوسيط <code>servers‎</code> هو مصفوفة من سلاسل نصية تمثِّل عناوينًا منسقةً وفقًا للتنسيق المحدد في المعيار rfc5952. إن كان المنفذ هو منفذ DNS الافتراضي الذي حددته IANA (وهو 53)، فيمكن حذفه.
+
يضبط هذا التابع العناوين IP ومنافذ الخوادم لاستعمالها عند تنفيذ استبيان DNS. الوسيط <code>servers‎</code> هو مصفوفة من سلاسل نصية تمثِّل عناوينًا منسقةً وفقًا للتنسيق المحدد في المعيار rfc5952. إن كان المنفذ هو منفذ DNS الافتراضي الذي حددته IANA (وهو 53)، فيمكن حذفه.<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
 
 
dns.setServers([
 
dns.setServers([
 
   '4.4.4.4',
 
   '4.4.4.4',
سطر 390: سطر 414:
 
   '[2001:4860:4860::8888]:1053'
 
   '[2001:4860:4860::8888]:1053'
 
]);
 
]);
</syntaxhighlight>
+
</syntaxhighlight>سيُرمَى خطأ إن أعطي عنوان غير صالح.
سيُرمَى خطأ إن أعطي عنوان غير صالح.
+
 
 
يجب ألا يُستدعَى التابع <code>dns.setServers()‎</code> عندما تكون إحدى تعليمات DNS قيد المعالجة.
 
يجب ألا يُستدعَى التابع <code>dns.setServers()‎</code> عندما تكون إحدى تعليمات DNS قيد المعالجة.
انتبه إلى أنَّ هذا التابع يعمل بشكل مشابه تقريبًا للدالة <code>resolve.conf‎</code>. هذا يعني أنَّه إن أعطت محاولة إجراء استبيان من أول خادم خطأً من النوع <code>NOTFOUND‎</code>، فلن يحاول التابع <code>resolve()‎</code> إكمال عملية الاستبيان من الخوادم اللاحقة المعطاة. سيُلجَأ إلى استعادة خوادم DNS والرجوع إليها إن انتهت مهلة سابقاتها أو احتوى الناتج على أخطاء أخرى فقط.
+
 
== واجهة وعود DNS البرمجية (DNS Promises API) ==
+
انتبه إلى أنَّ هذا التابع يعمل بشكل مشابه تقريبًا للدالة <code>[http://man7.org/linux/man-pages/man5/resolv.conf.5.html resolve.conf‎]</code>. هذا يعني أنَّه إن أعطت محاولة إجراء استبيان من أول خادم خطأً من النوع <code>NOTFOUND‎</code>، فلن يحاول التابع <code>resolve()‎</code> إكمال عملية الاستبيان من الخوادم اللاحقة المعطاة. سيُلجَأ إلى استعادة خوادم DNS والرجوع إليها إن انتهت مهلة سابقاتها أو احتوى الناتج على أخطاء أخرى فقط.
 +
==واجهة وعود DNS البرمجية (DNS Promises API)==
 
الاستقرار: 1-قيد التجريب.
 
الاستقرار: 1-قيد التجريب.
 +
 
توفِّر الواجهة <code>dns.promises‎</code> البرمجية مجموعةً بديلةً لتوابع DNS غير المتزامنة التي تعيد كائنات من النوع <code>Promise‎</code> بدلًا من استعمال ردود النداء. يمكن الوصول إلى الواجهة البرمجية عبر <code>require('dns').promises‎</code>.
 
توفِّر الواجهة <code>dns.promises‎</code> البرمجية مجموعةً بديلةً لتوابع DNS غير المتزامنة التي تعيد كائنات من النوع <code>Promise‎</code> بدلًا من استعمال ردود النداء. يمكن الوصول إلى الواجهة البرمجية عبر <code>require('dns').promises‎</code>.
=== الصنف <code>dnsPromises.Resolver‎</code> ===
+
===الصنف <code>dnsPromises.Resolver‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
 +
 
يعدُّ الصنف <code>dnsPromises.Resolver‎‎</code> مستبينًا مستقلًا لطلبات DNS.
 
يعدُّ الصنف <code>dnsPromises.Resolver‎‎</code> مستبينًا مستقلًا لطلبات DNS.
انتبه إلى أنَّه ستُستعمَل إعدادات الخادم الافتراضية عند إنشاء مستبين جديد. لا تؤثر عملية ضبط الخوادم التي يستعملها مستبين معيَّن عبر التابع <code>resolver.setServers()‎</code> على بقية المستبينات:
+
 
<syntaxhighlight lang="javascript">  
+
انتبه إلى أنَّه ستُستعمَل إعدادات الخادم الافتراضية عند إنشاء مستبين جديد. لا تؤثر عملية ضبط الخوادم التي يستعملها مستبين معيَّن عبر التابع <code>resolver.setServers()‎</code> على بقية المستبينات:<syntaxhighlight lang="javascript">  
 
const { Resolver } = require('dns').promises;
 
const { Resolver } = require('dns').promises;
 
const resolver = new Resolver();
 
const resolver = new Resolver();
سطر 415: سطر 442:
 
   const addresses = await resolver.resolve4('example.org');
 
   const addresses = await resolver.resolve4('example.org');
 
})();
 
})();
</syntaxhighlight>  
+
</syntaxhighlight>توابع الواجهة <code>dnsPromises‎</code> البرمجية المتاحة الآن هي:
توابع الواجهة <code>dnsPromises‎</code> البرمجية المتاحة الآن هي:
+
*<code>[[Node.js/dns#dnsPromises.getServers.28.29.E2.80.8E|resolver.getServers()‎]]</code>
* <code>resolver.getServers()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolve.28hostname.5B.2C rrtype.5D.29.E2.80.8E|resolver.resolve()‎]]</code>
* <code>resolver.resolve()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolve4.28hostname.5B.2C options.5D.29.E2.80.8E|resolver.resolve4()‎]]</code>
* <code>resolver.resolve4()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolve6.28hostname.5B.2C options.5D.29.E2.80.8E|resolver.resolve6()‎]]</code>
* <code>resolver.resolve6()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveAny.28hostname.29.E2.80.8E|resolver.resolveAny()‎]]</code>
* <code>resolver.resolveAny()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveCname.28hostname.29.E2.80.8E|resolver.resolveCname()‎]]</code>
* <code>resolver.resolveCname()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveMx.28hostname.29.E2.80.8E|resolver.resolveMx()‎]]</code>
* <code>resolver.resolveMx()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveNaptr.28hostname.29.E2.80.8E|resolver.resolveNaptr()‎]]</code>
* <code>resolver.resolveNaptr()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveNs.28hostname.29.E2.80.8E|resolver.resolveNs()‎]]</code>
* <code>resolver.resolveNs()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolvePtr.28hostname.29.E2.80.8E|resolver.resolvePtr()‎]]</code>
* <code>resolver.resolvePtr()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveSoa.28hostname.29.E2.80.8E|resolver.resolveSoa()]][[Node.js/dns#dnsPromises.resolvePtr.28hostname.29.E2.80.8E|‎]]</code>
* <code>resolver.resolveSrv()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveSrv.28hostname.29.E2.80.8E|resolver.resolveSrv()‎]]</code>
* <code>resolver.resolveTxt()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.resolveTxt.28hostname.29.E2.80.8E|resolver.resolveTxt()‎]]</code>
* <code>resolver.reverse()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.reverse.28ip.29.E2.80.8E|resolver.reverse()‎]]</code>
* <code>resolver.setServers()‎</code>  
+
*<code>[[Node.js/dns#dnsPromises.setServers.28servers.29.E2.80.8E|resolver.setServers()‎]]</code>
=== <code>dns.getServers()‎</code> ===
+
===<code>dnsPromises.getServers()‎</code>===
 
أضيف في الإصدار: v0.11.3.
 
أضيف في الإصدار: v0.11.3.
* القيم المعادة: [[JavaScript/String|<string[]‎>]]
+
*القيم المعادة: [[JavaScript/String|<string[]‎>]]
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار rtc5952، التي ضُبطَت آنذاك لتحليل DNS. ستتضمن السلسلة النصية جزءًا للمنفذ إن استخدم منفذ مخصص.
+
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار [[rfc:5952#section-6|rtc5952]]، التي ضُبطَت آنذاك لتحليل DNS. ستتضمن السلسلة النصية جزءًا للمنفذ إن استخدم منفذ مخصص.<syntaxhighlight lang="text">[
<SYNTAXHIGHLIGHT LANG="text">[
 
 
   '4.4.4.4',
 
   '4.4.4.4',
 
   '2001:4860:4860::8888',
 
   '2001:4860:4860::8888',
سطر 442: سطر 468:
 
]
 
]
 
</syntaxhighlight>
 
</syntaxhighlight>
=== <codednsPromises.lookup(hostname[, options])‎</code> ===
+
===<code>dnsPromises.lookup(hostname[, options])‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
* <code>options‎</code>: ‏[[JavaScript/Number|<integer>]]‏ | [[JavaScript/Object|<Object>]]
+
*<code>options‎</code>: ‏[[JavaScript/Number|<integer>]]‏ | [[JavaScript/Object|<Object>]]
** <code>family‎</code>: ‏[[JavaScript/Number|<integer>]] عائلة السجل. يجب أن يأخذ القيمة 4 أو 6. يعاد العنوان IPv4 والعنوان IPv6 كلاهما افتراضيًّا.
+
**<code>family‎</code>: ‏[[JavaScript/Number|<integer>]] عائلة السجل. يجب أن يأخذ القيمة 4 أو 6. يعاد العنوان IPv4 والعنوان IPv6 كلاهما افتراضيًّا.
** <code>hints‎</code>: ‏[[JavaScript/Number|<number>]] واحدةٌ أو أكثر من الرايات <code>getaddrinfo‎</code> المدعومة. يمكن تمرير رايات متعددة عبر دمجها باستعمال المعامل OR الثنائي.
+
**<code>hints‎</code>: ‏[[JavaScript/Number|<number>]] واحدةٌ أو أكثر من الرايات <code>getaddrinfo‎</code> المدعومة. يمكن تمرير رايات متعددة عبر دمجها باستعمال المعامل OR الثنائي.
** <code>all‎</code>: ‏‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته true، يُستبيَن الكائن <code>Promise‎</code> مع جميع العناوين الموجودة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: false.
+
**<code>all‎</code>: ‏‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته <code>true</code>، يُستبيَن الكائن <code>Promise‎</code> مع جميع العناوين الموجودة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: <code>false</code>.
** <code>verbatim‎</code>: ‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته true، يُستبيَن الكائن <code>Promise‎</code> مع العناوين IPv4 و IPv6 بالترتيب الذي أعاده بهم مستبين DNS. عندما تكون قيمته false، توضع العناوين IPv4 قبل عناوين IPv6. القيمة الافتراضية حاليًا هي: false (أي يعاد ترتيب العناوين)، ولكن يُتوقع أن تتغير في المستقبل القريب. يجب أن تستعمل الشيفرات الجديدة القيمة <code>{ verbatim: true }‎</code>.
+
**<code>verbatim‎</code>: ‏[[JavaScript/Boolean|<boolean>]] عندما تكون قيمته <code>true</code>، يُستبيَن الكائن <code>Promise‎</code> مع العناوين IPv4 و IPv6 بالترتيب الذي أعاده بهم مستبين DNS. عندما تكون قيمته <code>false</code>، توضع العناوين IPv4 قبل عناوين IPv6. القيمة الافتراضية حاليًا هي: <code>false</code> (أي يعاد ترتيب العناوين)، ولكن يُتوقع أن تتغير في المستقبل القريب. يجب أن تستعمل الشيفرات الجديدة القيمة <code>{ verbatim: true }‎</code>.
يستبين هذا التابع اسم المضيف (hostname) -مثل <code>'nodejs.org'‎</code>- إلى أول سجل A (أي IPv4) أو AAAA (أي IPv6) يعثر عليه. جميع خيارات الكائن <code>option‎</code> هي اختيارية. إن كان الوسيط options عددًا صحيحًا، فيجب أن تكون قيمته 4 أو 6. أما إن لم يُعطَ الوسيط options، فستُعاد العناوين IPv4 و IPv6 كلاهما حينئذٍ إن عُثِر عليها.
+
يستبين هذا التابع اسم المضيف (hostname) -مثل <code>'nodejs.org'‎</code>- إلى أول سجل A (أي IPv4) أو AAAA (أي IPv6) يعثر عليه. جميع خيارات الكائن <code>option‎</code> هي اختيارية. إن كان الوسيط options عددًا صحيحًا، فيجب أن تكون قيمته 4 أو 6. أما إن لم يُعطَ الوسيط options، فستُعاد العناوين IPv4 و IPv6 كلاهما حينئذٍ إن عُثِر عليها. عند ضبط الخيار all إلى القيمة <code>true</code>، يُستبيَن الكائن <code>Promise</code> مع جعل الوسيط <code>addresses‎</code> مصفوفةً من كائنات لها الخاصيتين <code>address‎</code> و <code>family‎</code>.
عند ضبط الخيار all إلى القيمة true، يُستبيَن الكائن <code>Promise</code> مع جعل الوسيط <code>addresses‎</code> مصفوفةً من كائنات لها الخاصيتين <code>address‎</code> و <code>family‎</code>.
+
 
في حال حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code> إذ يكون <code>err.code‎</code> رمز الخطأ. تذكر دومًا أنَّ <code>err.code‎</code> سيُضبَط إلى القيمة <code>'ENOENT'‎</code> ليس عندما لا يوجد اسم مضيف فقط ولكن عند فشل عملية البحث (lookup) أيضًا بطرائق أخرى مثل عدم توافر واصفات للملف (file descriptors).
+
في حال حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code> إذ يكون <code>err.code‎</code> رمز الخطأ. تذكر دومًا أنَّ <code>err.code‎</code> سيُضبَط إلى القيمة <code>'ENOENT'‎</code> ليس عندما لا يوجد اسم مضيف فقط ولكن عند فشل عملية البحث (lookup) أيضًا بطرائق أخرى مثل عدم توافر واصفات للملف (file descriptors).
ليس بالضرورة أن تملك الدالة <code>dns.lookup()‎</code> كل شيء مطلوب للعمل مع البروتوكول DNS، إذ يستعمل التنفيذ خدمات نظام التشغيل التي تستطيع ربط الأسماء بالعناوين والعكس بالعكس. لهذا التنفيذ عواقب غامضة ولكن مهمة تؤثر على سلوك أي تطبيق من تطبيقات Node.js. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم «اعتبارات التنفيذ» -في الأسفل- قبل استعمال التابع <code>dns.lookup()‎</code>.
+
 
<SYNTAXHIGHLIGHT LANG="javascript">const dns = require('dns');
+
ليس بالضرورة أن تملك الدالة <code>dns.lookup()‎</code> كل شيء مطلوب للعمل مع البروتوكول DNS، إذ يستعمل التنفيذ خدمات نظام التشغيل التي تستطيع ربط الأسماء بالعناوين والعكس بالعكس. لهذا التنفيذ عواقب غامضة ولكن مهمة تؤثر على سلوك أي تطبيق من تطبيقات Node.js. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم «<nowiki/>[[Node.js/dns#.D8.A7.D8.B9.D8.AA.D8.A8.D8.A7.D8.B1.D8.A7.D8.AA .D8.A7.D9.84.D8.AA.D9.86.D9.81.D9.8A.D8.B0|اعتبارات التنفيذ]]» -في الأسفل- قبل استعمال التابع <code>dns.lookup()‎</code>.<syntaxhighlight lang="javascript">const dns = require('dns');
 
const dnsPromises = dns.promises;
 
const dnsPromises = dns.promises;
 
const options = {
 
const options = {
سطر 473: سطر 499:
 
});
 
});
 
</syntaxhighlight>
 
</syntaxhighlight>
=== <code>dnsPromises.lookupService(address, port)</code> ===
+
===<code>dnsPromises.lookupService(address, port)</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>address‎</code>: ‏[[JavaScript/String|<string>]]
+
*<code>address‎</code>: ‏[[JavaScript/String|<string>]]
* <code>‎port</code>: ‏[[JavaScript/Number|<number>]]
+
*<code>‎port</code>: ‏[[JavaScript/Number|<number>]]
يستبين هذا التابع العنوان <code>address<code> والمنفذ <code>port‎</code> المعطى إلى اسم مضيف (hostname) وخدمة (service) باستعمال التنفيذ <code>getnameinfo‎</code> الضمني لنظام التشغيل.
+
يستبين هذا التابع العنوان <code>address</code> والمنفذ <code>port‎</code> المعطى إلى اسم مضيف (hostname) وخدمة (service) باستعمال التنفيذ <code>getnameinfo‎</code> الضمني لنظام التشغيل.
 +
 
 
إن لم يكن الوسيط <code>address‎</code> عنوان IP صالح، فسيُرمى الخطأ <code>TypeError‎</code>. سيحوَّل المنفذ <code>port‎</code> إلى عدد رغمًا عنه؛ فإن لم يكن منفذًا شرعيًّا، فسيُرمى الخطأ <code>TypeError‎</code>.
 
إن لم يكن الوسيط <code>address‎</code> عنوان IP صالح، فسيُرمى الخطأ <code>TypeError‎</code>. سيحوَّل المنفذ <code>port‎</code> إلى عدد رغمًا عنه؛ فإن لم يكن منفذًا شرعيًّا، فسيُرمى الخطأ <code>TypeError‎</code>.
في حال حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code>، إذ يكون <code>err.code‎</code> هو رمز الخطأ.
+
 
<SYNTAXHIGHLIGHT LANG="javascript">const dnsPromises = require('dns').promises;
+
في حال حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code>، إذ يكون <code>err.code‎</code> هو رمز الخطأ.<syntaxhighlight lang="javascript">const dnsPromises = require('dns').promises;
 
dnsPromises.lookupService('127.0.0.1', 22).then((result) => {
 
dnsPromises.lookupService('127.0.0.1', 22).then((result) => {
 
   console.log(result.hostname, result.service);
 
   console.log(result.hostname, result.service);
سطر 486: سطر 513:
 
});
 
});
 
</syntaxhighlight>
 
</syntaxhighlight>
=== <code>dns.resolve(hostname[, rrtype], callback)‎</code> ===
+
===<code>dnsPromises.resolve(hostname[, rrtype])‎</code>===
 
أضيف في الإصدار: v0.1.27.
 
أضيف في الإصدار: v0.1.27.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم الضيف الذي سيُستبيَن.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم الضيف الذي سيُستبيَن.
* <code>rrtype‎</code>:‏ [[JavaScript/String|<string>]] نوع سجل المصدر. القيمة الافتراضية هي: <code>'A'</code>.
+
*<code>rrtype‎</code>:‏ [[JavaScript/String|<string>]] نوع سجل المصدر. القيمة الافتراضية هي: <code>'A'</code>.
 
يستعمل هذا التابع بروتوكول DNS للاستبيان عن اسم مضيف (مثل <code>'nodejs.org'‎</code>) إلى مصفوفة من سجلات المصدر (resource records). يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من سجلات المصدر عند نجاح العملية. يختلف نوع وبنية النتائج الفردية التي نحصل عليها بناءً على قيمة الوسيط <code>rrtype‎</code> وهي:
 
يستعمل هذا التابع بروتوكول DNS للاستبيان عن اسم مضيف (مثل <code>'nodejs.org'‎</code>) إلى مصفوفة من سجلات المصدر (resource records). يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من سجلات المصدر عند نجاح العملية. يختلف نوع وبنية النتائج الفردية التي نحصل عليها بناءً على قيمة الوسيط <code>rrtype‎</code> وهي:
 
+
{| class="wikitable"
rrtype
+
!<code>rrtype</code>
محتويات records
+
!محتويات السجلات <code>records</code>
نوع النتيجة
+
!نوع النتيجة
التابع المختصر المقابل
+
!التابع المختصر المقابل
'A'
+
|-
عناوين IPv4 (القيمة الافتراضية).
+
|<code>'A'</code>
<string>
+
|عناوين IPv4 (القيمة الافتراضية).
dnsPromises.resolve4()
+
|[[JavaScript/String|<string>]]
'AAAA'
+
|<code>[[Node.js/dns#dnsPromises.resolve4.28hostname.5B.2C options.5D.29.E2.80.8E|dnsPromises.resolve4()‎]]</code>
عناوين IPv6.
+
|-
<string>
+
|<code>'AAAA'</code>
dnsPromises.resolve6()
+
|عناوين IPv6.
'ANY'
+
|[[JavaScript/String|<string>]]
أية سجلات.
+
|<code>[[Node.js/dns#dnsPromises.resolve6.28hostname.5B.2C options.5D.29.E2.80.8E|dnsPromises.resolve6()‎]]</code>
<Object>
+
|-
dnsPromises.resolveAny()
+
|<code>'ANY'</code>
'CNAME'
+
|أية سجلات.
سجلات الاسم المعياري (canonical name records).
+
|[[JavaScript/Object/toString|<Object>]]
<string>
+
|<code>[[Node.js/dns#dnsPromises.resolveAny.28hostname.29.E2.80.8E|dnsPromises.resolveAny()‎]]</code>
dnsPromises.resolveCname()
+
|-
'MX'
+
|<code>'CNAME'</code>
سجلات تبادل البريد (mail exchange records).
+
|سجلات الاسم المعياري (canonical name records).
<Object>
+
|[[JavaScript/String|<string>]]
dnsPromises.resolveMx()
+
|<code>[[Node.js/dns#dnsPromises.resolveCname.28hostname.29.E2.80.8E|dnsPromises.resolveCname()‎]]</code>
'NAPTR'
+
|-
سجلات مؤشر اسم التفويض (name authority pointer records).
+
|<code>'MX'</code>
<Object>
+
|سجلات تبادل البريد (mail exchange records).
dnsPromises.resolveNaptr()
+
|[[JavaScript/Object/toString|<Object>]]
'NS'
+
|<code>[[Node.js/dns#dnsPromises.resolveMx.28hostname.29.E2.80.8E|dnsPromises.resolveMx()‎]]</code>
سجلات خادم الأسماء (Name Server).
+
|-
<string>
+
|<code>'NAPTR'</code>
dnsPromises.resolveNs()
+
|سجلات مؤشر اسم التفويض (name authority pointer records).
'PTR'
+
|[[JavaScript/Object/toString|<Object>]]
سجلات المؤشر (pointer records).
+
|<code>[[Node.js/dns#dnsPromises.resolveNaptr.28hostname.29.E2.80.8E|dnsPromises.resolveNaptr()‎]]</code>
<string>
+
|-
dnsPromises.resolvePtr()
+
|<code>'NS'</code>
'SOA'
+
|سجلات خادم الأسماء (Name Server).
بداية سجلات التفويض (authority records).
+
|[[JavaScript/String|<string>]]
<Object>
+
|<code>[[Node.js/dns#dnsPromises.resolveNs.28hostname.29.E2.80.8E|dnsPromises.resolveNs()‎]]</code>
dnsPromises.resolveSoa()
+
|-
'SRV'
+
|<code>'PTR'</code>
سجلات خدمة (service records).
+
|سجلات المؤشر (pointer records).
<Object>
+
|[[JavaScript/String|<string>]]
dnsPromises.resolveSrv()
+
|<code>[[Node.js/dns#dnsPromises.resolvePtr.28hostname.29.E2.80.8E|dnsPromises.resolvePtr()‎]]</code>
'TXT'
+
|-
سجلات نصية (text records).
+
|<code>'SOA'</code>
[[JavaScript/String|<string[]‎>]]
+
|بداية سجلات التفويض  (authority records).
dnsPromises.resolveTxt()
+
|[[JavaScript/Object/toString|<Object>]]
 
+
|<code>[[Node.js/dns#dnsPromises.resolveSoa.28hostname.29.E2.80.8E|dnsPromises.resolveSoa()]][[Node.js/dns#dnsPromises.resolvePtr.28hostname.29.E2.80.8E|‎]]</code>
 
+
|-
 
+
|<code>'SRV'</code>
 +
|سجلات خدمة (service records).
 +
|[[JavaScript/Object/toString|<Object>]]
 +
|<code>[[Node.js/dns#dnsPromises.resolveSrv.28hostname.29.E2.80.8E|dnsPromises.resolveSrv()‎]]</code>
 +
|-
 +
|<code>'TXT'</code>
 +
|سجلات نصية (text records).
 +
|[[JavaScript/String/search|<string[]‎>]]
 +
|<code>[[Node.js/dns#dnsPromises.resolveTxt.28hostname.29.E2.80.8E|dnsPromises.resolveTxt()‎]]</code>
 +
|}
 
في حال حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code>، إذ يعدُّ <code>err.code‎</code> أحد رموز الخطأ في DNS.
 
في حال حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code>، إذ يعدُّ <code>err.code‎</code> أحد رموز الخطأ في DNS.
=== <codednsPromises.resolve4(hostname[, options])‎</code> ===
+
===<code>dnsPromises.resolve4(hostname[, options])‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
* <code>options</code>:‏ [[JavaScript/Object|<Object>]]
+
*<code>options</code>:‏ [[JavaScript/Object|<Object>]]
** <code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
+
**<code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv4 (سجلات 'A') من أجل اسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من عناوين IPv4 (مثل <code>['74.125.79.104', '74.125.79.105', '74.125.79.106']‎</code>).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv4 (سجلات 'A') من أجل اسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من عناوين IPv4 (مثل <code>['74.125.79.104', '74.125.79.105', '74.125.79.106']‎</code>).
=== <code>dnsPromises.resolve6(hostname[, options])‎</code> ===
+
===<code>dnsPromises.resolve6(hostname[, options])‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
* <code>options</code>:‏ [[JavaScript/Object|<Object>]]
+
*<code>options</code>:‏ [[JavaScript/Object|<Object>]]
** <code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
+
**<code>ttl</code>:‏ [[JavaScript/Boolean|<boolean>]] استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من الكائنات <code>{ address: '1.2.3.4', ttl: 60 }‎</code> بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv6 (سجلات 'AAAA') من أجل اسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من عناوين IPv6.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv6 (سجلات 'AAAA') من أجل اسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من عناوين IPv6.
=== <code>dnsPromises.resolveAny(hostname)‎</code> ===
+
===<code>dnsPromises.resolveAny(hostname)‎</code>===
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان جميع السجلات (يُعرَف أيضًا بأنه استعلام <code>ANY‎</code> أو <code>*‎</code>). عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً تحتوي على مختلف أنواع السجلات. يملك كل سجل الخاصية <code>type‎</code> التي تشير إلى نوع السجل الحالي. وبناءً على قيمة <code>type‎</code>، ستُعرَض خاصيات إضافية في الكائن هي:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان جميع السجلات (يُعرَف أيضًا بأنه استعلام <code>ANY‎</code> أو <code>*‎</code>). عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً تحتوي على مختلف أنواع السجلات. يملك كل سجل الخاصية <code>type‎</code> التي تشير إلى نوع السجل الحالي. وبناءً على قيمة <code>type‎</code>، ستُعرَض خاصيات إضافية في الكائن هي:
 
+
{| class="wikitable"
النوع
+
!النوع
الخاصيات
+
!الخاصيات
'A'
+
|-
address/ttl
+
|<code>'A'</code>
'AAAA'
+
|<code>address/ttl</code>
address/ttl
+
|-
'CNAME'
+
|<code>'AAAA'</code>
value
+
|<code>address/ttl</code>
'MX'
+
|-
تشير إلى التابع dnsPromises.resolveMx()‎.
+
|<code>'CNAME'</code>
'NAPTR'
+
|<code>value</code>
تشير إلى التابع dnsPromises.resolveNaptr()‎.
+
|-
'NS'
+
|<code>'MX'</code>
value
+
|تشير إلى التابع <code>[[Node.js/dns#dnsPromises.resolveMx.28hostname.29.E2.80.8E|dnsPromises.resolveMx()‎]]</code>‎.
'PTR'
+
|-
value
+
|<code>'NAPTR'</code>
'SOA'
+
|تشير إلى التابع <code>[[Node.js/dns#dnsPromises.resolveNaptr.28hostname.29.E2.80.8E|dnsPromises.resolveNaptr()‎]]</code>‎.
تشير إلى التابع dnsPromises.resolveSoa()‎.
+
|-
'SRV'
+
|<code>'NS'</code>
تشير إلى التابع dnsPromises.resolveSrv()‎.
+
|<code>value</code>
'TXT'
+
|-
يحتوي هذا النوع من السجل على خاصية مصفوفة تدعى entries تشير إلى dnsPromises.resolveTxt()‎ مثل { entries: ['...'], type: 'TXT' }.
+
|<code>'PTR'</code>
 
+
|<code>value</code>
إليك مثالٌ عن الكائن الناتج:
+
|-
<syntaxhighlight lang="javascript">
+
|<code>'SOA'</code>
 +
|تشير إلى التابع <code>[[Node.js/dns#dnsPromises.resolveSoa.28hostname.29.E2.80.8E|dnsPromises.resolveSoa()]][[Node.js/dns#dnsPromises.resolvePtr.28hostname.29.E2.80.8E|]]</code>.
 +
|-
 +
|<code>'SRV'</code>
 +
|تشير إلى التابع <code>[[Node.js/dns#dnsPromises.resolveSrv.28hostname.29.E2.80.8E|dnsPromises.resolveSrv()‎]]</code>‎.
 +
|-
 +
|<code>'TXT'</code>
 +
|يحتوي هذا النوع من السجل على خاصية مصفوفة تدعى <code>entries</code> تشير إلى <code>[[Node.js/dns#dnsPromises.resolveTxt.28hostname.29.E2.80.8E|dnsPromises.resolveTxt()‎]]</code> مثل <code>{ entries: ['...'], type: 'TXT' }</code>.
 +
|}
 +
إليك مثالٌ عن الكائن الناتج:<syntaxhighlight lang="javascript">
 
[ { type: 'A', address: '127.0.0.1', ttl: 299 },
 
[ { type: 'A', address: '127.0.0.1', ttl: 299 },
 
   { type: 'CNAME', value: 'example.com' },
 
   { type: 'CNAME', value: 'example.com' },
سطر 598: سطر 643:
 
     expire: 1800,
 
     expire: 1800,
 
     minttl: 60 } ]
 
     minttl: 60 } ]
</syntaxhighlight>  
+
</syntaxhighlight>
=== <code>dnsPromises.resolveCname(hostname)‎</code> ===
+
===<code>dnsPromises.resolveCname(hostname)‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات <code>CNAME</code> لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من سجلات الاسم المعياري المتاحة لاسم المضيف <code>hostname‎</code> (مثل <code>['bar.example.com']‎</code>).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات <code>CNAME</code> لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من سجلات الاسم المعياري المتاحة لاسم المضيف <code>hostname‎</code> (مثل <code>['bar.example.com']‎</code>).
=== <code>dnsPromises.resolveMx(hostname)‎</code> ===
+
===<code>dnsPromises.resolveMx(hostname)‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات <code>MX‎</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من الكائنات التي تحتوي على الخاصية <code>priority‎</code> والخاصية <code>exchange‎</code> (مثل  <code>[{priority: 10, exchange: 'mx.example.com'}, ...]‎</code>).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات <code>MX‎</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من الكائنات التي تحتوي على الخاصية <code>priority‎</code> والخاصية <code>exchange‎</code> (مثل  <code>[{priority: 10, exchange: 'mx.example.com'}, ...]‎</code>).
=== <code>dnsPromises.resolveNaptr(hostname)‎</code> ===
+
===<code>dnsPromises.resolveNaptr(hostname)‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]] اسم المضيف المراد استبيناه.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان السجلات القائمة على تعابير نمطية (سجلات <code>NAPTR</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من كائنات لها الخاصيات التالية:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان السجلات القائمة على تعابير نمطية (سجلات <code>NAPTR</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من كائنات لها الخاصيات التالية:
* <code>flags‎</code>  
+
*<code>flags‎</code>
* <code>service</code>  
+
*<code>service</code>
* <code>regexp</code>  
+
*<code>regexp</code>
* <code>replacement</code>  
+
*<code>replacement</code>
* <code>order</code>  
+
*<code>order</code>
* <code>preference</code>  
+
*<code>preference</code>
<SYNTAXHIGHLIGHT LANG="javascript">{
+
<syntaxhighlight lang="javascript">{
 
   flags: 's',
 
   flags: 's',
 
   service: 'SIP+D2U',
 
   service: 'SIP+D2U',
سطر 625: سطر 670:
 
   preference: 100
 
   preference: 100
 
}
 
}
</syntaxhighlight>  
+
</syntaxhighlight>
=== <code>dnsPromises.resolveNs(hostname)‎</code> ===
+
===<code>dnsPromises.resolveNs(hostname)‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات <code>NS‎</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف  <code>hostname‎</code> (مثل <code>['ns1.example.com', 'ns2.example.com']‎</code>).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات <code>NS‎</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف  <code>hostname‎</code> (مثل <code>['ns1.example.com', 'ns2.example.com']‎</code>).
== <code>dnsPromises.resolvePtr(hostname)‎</code> ==
+
===<code>dnsPromises.resolvePtr(hostname)‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات <code>PTR</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من السلاسل النصية التي تحتوي على سجلات الرد (reply records).
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات <code>PTR</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من السلاسل النصية التي تحتوي على سجلات الرد (reply records).
=== <code>dnsPromises.resolveSoa(hostname)‎</code> ===
+
===<code>dnsPromises.resolveSoa(hostname)‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان بداية سجل التفويض (سجل <code>SOA</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع كائن يملك الخاصيات التالية:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان بداية سجل التفويض (سجل <code>SOA</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع كائن يملك الخاصيات التالية:
* <code>nsname‎</code>
+
*<code>nsname‎</code>
* <code>hostmaster‎</code>
+
*<code>hostmaster‎</code>
* <code>serial‎</code>
+
*<code>serial‎</code>
* <code>refresh‎</code>
+
*<code>refresh‎</code>
* <code>retry‎</code>
+
*<code>retry‎</code>
* <code>expire‎</code>
+
*<code>expire‎</code>
* <code>minttl‎</code>
+
*<code>minttl‎</code>
<SYNTAXHIGHLIGHT LANG="javascript">{
+
<syntaxhighlight lang="javascript">{
 
   nsname: 'ns.example.com',
 
   nsname: 'ns.example.com',
 
   hostmaster: 'root.example.com',
 
   hostmaster: 'root.example.com',
سطر 655: سطر 700:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
=== <code>dnsPromises.resolveSrv(hostname)‎</code> ===
+
===<code>dnsPromises.resolveSrv(hostname)‎</code>===
 
أضيف في الإصدار: v0.1.27.
 
أضيف في الإصدار: v0.1.27.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات خدمة (سجلات <code>SRV</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من كائنات تمتلك الخاصيات التالية:
 
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات خدمة (سجلات <code>SRV</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة من كائنات تمتلك الخاصيات التالية:
* <code>priority</code>
+
*<code>priority</code>
* <code>weight</code>
+
*<code>weight</code>
* <code>port</code>
+
*<code>port</code>
* <code>name</code>
+
*<code>name</code>
 
<syntaxhighlight lang="javascript">  
 
<syntaxhighlight lang="javascript">  
 
{
 
{
سطر 670: سطر 715:
 
   name: 'service.example.com'
 
   name: 'service.example.com'
 
}
 
}
</syntaxhighlight>  
+
</syntaxhighlight>
== <code>dnsPromises.resolveTxt(hostname)‎</code> ==
+
===<code>dnsPromises.resolveTxt(hostname)‎</code>===
 
أضيف في الإصدار: v0.1.27.
 
أضيف في الإصدار: v0.1.27.
* <code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
+
*<code>hostname‎</code>:‏ [[JavaScript/String|<string>]]
 
يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات <code>TXT</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة ثنائية البعد من السجلات النصية المتوافرة لاسم المضيف <code>hostname‎</code> (مثل <code>[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]‎</code>). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.
 
يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات <code>TXT</code>) لاسم المضيف <code>hostname‎</code>. عند نجاح العملية، يُقبَل الكائن <code>Promise‎</code> مع مصفوفة ثنائية البعد من السجلات النصية المتوافرة لاسم المضيف <code>hostname‎</code> (مثل <code>[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]‎</code>). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.
=== <code>dnsPromises.reverse(ip)‎</code> ===
+
===<code>dnsPromises.reverse(ip)‎</code>===
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>ip</code>:‏ [[JavaScript/String|<string>]]
+
*<code>ip</code>:‏ [[JavaScript/String|<string>]]
ينفِّذ هذا التابع تعليمة DNS بشكل عكسي لاستبيان عناوين IPv4 أو IPv6 إلى مصفوفة من أسماء المضيفين.
+
ينفِّذ هذا التابع تعليمة DNS بشكل عكسي لاستبيان عناوين IPv4 أو IPv6 إلى مصفوفة من أسماء المضيفين. عند حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code>، إذ يعدُّ <code>err.code‎</code> واحدًا من رموز الخطأ في DNS.
عند حصول خطأ، يُرفَض الكائن <code>Promise</code> مع كائن من النوع <code>Error‎</code>، إذ يعدُّ <code>err.code‎</code> واحدًا من رموز الخطأ في DNS.
+
===<code>dnsPromises.setServers(servers)‎</code>===
=== <code>dnsPromises.setServers(servers)‎</code> ===
 
 
أضيف في الإصدار: v10.6.0.
 
أضيف في الإصدار: v10.6.0.
* <code>servers‎</code>:‏ [[JavaScript/String|<string[]‎>]] مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار rfc5952.
+
*<code>servers‎</code>:‏ [[JavaScript/String|<string[]‎>]] مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار [[rfc:5952#section-6|rfc5952]].
يضبط هذا التابع العناوين IP ومنافذ الخوادم لاستعمالها عند تنفيذ استبيان DNS. الوسيط <code>servers‎</code> هو مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار rfc5952. إن كان المنفذ هو منفذ DNS الافتراضي الذي حددته IANA (وهو 53)، فيمكن حذفه حينئذٍ.
+
يضبط هذا التابع العناوين IP ومنافذ الخوادم لاستعمالها عند تنفيذ استبيان DNS. الوسيط <code>servers‎</code> هو مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار [[rfc:5952#section-6|rfc5952]]. إن كان المنفذ هو منفذ DNS الافتراضي الذي حددته IANA (وهو 53)، فيمكن حذفه حينئذٍ.<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
 
 
dnsPromises.setServers([
 
dnsPromises.setServers([
 
   '4.4.4.4',
 
   '4.4.4.4',
سطر 691: سطر 734:
 
   '[2001:4860:4860::8888]:1053'
 
   '[2001:4860:4860::8888]:1053'
 
]);
 
]);
</syntaxhighlight>
+
</syntaxhighlight>سيُرمَى خطأ إن أعطي عنوان غير صالح.
سيُرمَى خطأ إن أعطي عنوان غير صالح.
+
 
 
يجب ألا يُستدعَى التابع <code>dnsPromises.setServers()‎</code> عندما تكون إحدى تعليمات DNS قيد المعالجة.
 
يجب ألا يُستدعَى التابع <code>dnsPromises.setServers()‎</code> عندما تكون إحدى تعليمات DNS قيد المعالجة.
انتبه إلى أنَّ هذا التابع يعمل بشكل مشابه تقريبًا للدالة <code>resolve.conf‎</code>. هذا يعني أنَّه إن أعطت محاولة إجراء استبيان من أول خادم خطأً من النوع <code>NOTFOUND‎</code>، فلن يحاول التابع <code>resolve()‎</code> إكمال عملية الاستبيان من الخوادم اللاحقة المعطاة. سيُلجَأ إلى استعادة خوادم DNS والرجوع إليها إن انتهت مهلة سابقاتها أو احتوى الناتج على أخطاء أخرى فقط.
+
 
== رموز الخطأ (Error codes) ==
+
انتبه إلى أنَّ هذا التابع يعمل بشكل مشابه تقريبًا للدالة <code>[http://man7.org/linux/man-pages/man5/resolv.conf.5.html resolve.conf‎]</code>. هذا يعني أنَّه إن أعطت محاولة إجراء استبيان من أول خادم خطأً من النوع <code>NOTFOUND‎</code>، فلن يحاول التابع <code>resolve()‎</code> إكمال عملية الاستبيان من الخوادم اللاحقة المعطاة. سيُلجَأ إلى استعادة خوادم DNS والرجوع إليها إن انتهت مهلة سابقاتها أو احتوى الناتج على أخطاء أخرى فقط.
 +
==رموز الخطأ (Error codes)==
 
يمكن لأي تعليمة من تعليمات DNS أن تعيد أحد رموز الخطأ التالية:
 
يمكن لأي تعليمة من تعليمات DNS أن تعيد أحد رموز الخطأ التالية:
 +
{| class="wikitable"
 +
!رمز الخطأ
 +
!الوصف
 +
|-
 +
|<code>dns.NODATA‎</code>
 +
|أعاد خادم DNS ردًا دون احتوائه على أية بيانات
 +
|-
 +
|<code>dns.FORMERR</code>
 +
|تعليمة مطالبات (claims) خادم DNS غير منسقة بشكل صحيح.
 +
|-
 +
|<code>dns.SERVFAIL</code>
 +
|أعاد خادم DNS خطأ عام.
 +
|-
 +
|<code>dns.NOTFOUND</code>
 +
|لم يُعثر على اسم النطاق (domain name).
 +
|-
 +
|<code>dns.NOTIMP</code>
 +
|لا يُنفِّذ خادم DNS العملية المطلوبة.
 +
|-
 +
|<code>dns.REFUSED</code>
 +
|رفض خادم DNS التعليمة.
 +
|-
 +
|<code>dns.BADQUERY</code>
 +
|تعليمة DNS ذات تنسيق أو صيغة خطأ.
 +
|-
 +
|<code>dns.BADNAME</code>
 +
|صيغة أو تنسيق اسم المضيف خطأ.
 +
|-
 +
|<code>dns.BADFAMILY</code>
 +
|عائلة العنوان غير مدعومة.
 +
|-
 +
|<code>dns.BADRESP</code>
 +
|رد DNS ذو تنسيق أو صيغة خطأ.
 +
|-
 +
|<code>dns.CONNREFUSED</code>
 +
|لا يمكن الاتصال بخوادم DNS.
 +
|-
 +
|<code>dns.TIMEOUT</code>
 +
|انتهت المهلة أثناء محاولة الاتصال بخوادم DNS.
 +
|-
 +
|<code>dns.EOF</code>
 +
|نهاية الملف.
 +
|-
 +
|<code>dns.FILE</code>
 +
|حصل خطأ أثناء القراءة من الملف.
 +
|-
 +
|<code>dns.NOMEM</code>
 +
|نفدت الذاكرة.
 +
|-
 +
|<code>dns.DESTRUCTION</code>
 +
|لقد دُمِّرَت القناة.
 +
|-
 +
|<code>dns.BADSTR</code>
 +
|سلسلة نصية ذات تنسيق أو صيغة خطأ.
 +
|-
 +
|<code>dns.BADFLAGS</code>
 +
|الرايات المحددة غير مقبولة.
 +
|-
 +
|<code>dns.NONAME</code>
 +
|اسم المضيف المعطى ليس عدديًّا.
 +
|-
 +
|<code>dns.BADHINTS</code>
 +
|الرايات <code>hints‎</code> المحددة أو إحداها غير مقبولة.
 +
|-
 +
|<code>dns.NOTINITIALIZED</code>
 +
|لم تنجز عملية تهيئة المكتبة c-ares بعد.
 +
|-
 +
|<code>dns.LOADIPHLPAPI</code>
 +
|حصل خطأ أثناء تحميل الملف iphlpapi.dll.
 +
|-
 +
|<code>dns.ADDRGETNETWORKPARAMS</code>
 +
|لم يُعثَر على الدالة <code>GetNetworkParams</code>.
 +
|-
 +
|<code>dns.CANCELLED</code>
 +
|أُلغيَت تعليمة DNS.
 +
|}
 +
 +
==اعتبارات التنفيذ==
 +
رغم أنَّ التابع <code>[[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.lookup()‎]]</code> والتوابع <code>dns.resolve*()/dns.reverse()‎</code> الأخرى لديها الهدف نفسه وهو ربط اسم شبكة معين بعنوانها (أو العكس) إلا أنَّ سلوك كل منهما مختلف بعض الشيء. قد تؤدي هذه الاختلافات إلى عواقب غامضة ولكن مهمة تؤثر على سلوك تطبيق Node.js ككل.
 +
===<code>dns.lookup()‎</code>===
 +
إن تعمَّقنا بعض الشيء، نجد أنَّ التابع <code>[[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|dns.lookup()‎]]</code> يستعمل نفس خدمات نظام التشغيل كما تفعل أغلب التطبيقات الأخرى. على سبيل المثال، يستبين التابع [[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|<code>dns.lookup()‎</code>]] الاسم المعطى بالطريقة نفسها تقريبًا بشكل دائم مثلما يفعل الأمر <code>ping‎</code>. في أغلب الأنظمة المتوافقة مع المعيار POSIX، يمكن تعديل سلوك التابع [[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|<code>dns.lookup()‎</code>]] عبر تغيير الإعدادات في <code>[http://man7.org/linux/man-pages/man5/nsswitch.conf.5.html nsswitch.conf(5)]‎</code> و/أو <code>[http://man7.org/linux/man-pages/man5/resolv.conf.5.html resolv.conf(5)‎]</code>، ولكن انتبه إلى أنَّ تغيير هذه الملفات سيُغيِّر سلوك جميع البرامج الأخرى التي تعمل على نظام التشغيل نفسه.
 +
 +
رغم أنَّ استدعاء التابع [[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|<code>dns.lookup()‎</code>]] سيكون غير متزامن من وجهة نظر JavaScript إلا أنَّه يُنفَّذ كما لو كان استدعاءً متزامنًا للدالة <code>[http://man7.org/linux/man-pages/man3/getaddrinfo.3.html getaddrinfo(3)]‎</code> التي تعمل على مجمع خيط (threadpool) المكتبة libuv. ويمكن أن يترتَّب على هذا الأمر آثارًا سلبيةً على الأداء لبعض التطبيقات. لمزيد من التفاصيل، اطلع على قسم الخيار <code>[[Node.js/cli#UV THREADPOOL SIZE.3Dsize|UV_THREADPOOL_SIZE‎]]</code> في توثيق خيارات سطر الأوامر في Node.js.
 +
 +
انتبه إلى أنَّ مختلف واجهات الشبكة البرمجية (networking APIs) ستستدعي التابع [[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|<code>dns.lookup()‎</code>]] بشكل داخلي لاستبيان أسماء المضيف. إن كان ذلك مشكلةً، فاعتمد على استبيان اسم المضيف إلى عنوان باستعمال التابع <code>dns.resolve()‎</code> واستخدم العناوين بدلًا من اسم المضيف. أضف إلى ذلك، بعض واجهة الشبكة البرمجية (مثل <code>[[Node.js/net#socket.connect.28.29.E2.80.8E|socket.connect()]]‎</code> و <code>[[Node.js/dgram#dgram.createSocket.28options.5B.2C callback.5D.29.E2.80.8E .5B.D8.A7.D9.84.D9.85.D8.B5.D8.AF.D8.B1.5D|dgram.createSocket()‎]]</code>) تسمح باستبدال المستبين الافتراضي، الذي هو <code>dns.lookup()‎</code>.
 +
===التابع <code>dns.resolve()‎</code>، والتوابع <code>dns.resolve*()‎</code>، والتابع <code>dns.reverse()‎</code>===
 +
تنفَّذ هذه التوابع بشكل مختلف إلى حد كبير عن التابع [[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|<code>dns.lookup()‎</code>]]. إنها لا تستعمل الدالة <code>[http://man7.org/linux/man-pages/man3/getaddrinfo.3.html getaddrinfo(3)‎]</code> وتنفِّذ أحد استعلامات DNS على الشبكة دومًا. تجري هذه الاتصالات على الشبكة بشكل غير متزامن دومًا، ولا ستعمل مجمع خيوط المكتبة libuv مطلقًا.
  
رمز الخطأ
+
نتيجةً لذلك، لا يمكن أن يكون لهذه التوابع نفس التأثير السلبي على عمليات المعالجة الأخرى التي تقع في مجمع خيوط المكتبة libuv بخلاف التابع [[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|<code>dns.lookup()‎</code>]].
الوصف
 
dns.NODATA‎
 
أعاد خادم DNS ردًا دون احتوائه على أية بيانات
 
dns.FORMERR
 
تعليمة مطالبات (claims) خادم DNS غير منسقة بشكل صحيح.
 
dns.SERVFAIL
 
أعاد خادم DNS خطأ عام.
 
dns.NOTFOUND
 
لم يُعثر على اسم النطاق (domain name).
 
dns.NOTIMP
 
لا يُنفِّذ خادم DNS العملية المطلوبة.
 
dns.REFUSED
 
رفض خادم DNS التعليمة.
 
dns.BADQUERY
 
تعليمة DNS ذات تنسيق أو صيغة خطأ.
 
dns.BADNAME
 
صيغة أو تنسيق اسم المضيف خطأ.
 
dns.BADFAMILY
 
عائلة العنوان غير مدعومة.
 
dns.BADRESP
 
رد DNS ذو تنسيق أو صيغة خطأ.
 
dns.CONNREFUSED
 
لا يمكن الاتصال بخوادم DNS.
 
dns.TIMEOUT
 
انتهت المهلة أثناء محاولة الاتصال بخوادم DNS.
 
dns.EOF
 
نهاية الملف.
 
dns.FILE
 
حصل خطأ أثناء القراءة من الملف.
 
dns.NOMEM
 
نفدت الذاكرة.
 
dns.DESTRUCTION
 
لقد دُمِّرَت القناة.
 
dns.BADSTR
 
سلسلة نصية ذات تنسيق أو صيغة خطأ.
 
dns.BADFLAGS
 
الرايات المحددة غير مقبولة.
 
dns.NONAME
 
اسم المضيف المعطى ليس عدديًّا.
 
dns.BADHINTS
 
الرايات <code>hints‎</code> المحددة أو إحداها غير مقبولة.
 
dns.NOTINITIALIZED
 
لم تنجز عملية تهيئة المكتبة c-ares بعد.
 
dns.LOADIPHLPAPI
 
حصل خطأ أثناء تحميل الملف iphlpapi.dll.
 
dns.ADDRGETNETWORKPARAMS
 
لم يُعثَر على الدالة GetNetworkParams.
 
dns.CANCELLED
 
أُلغيَت تعليمة DNS.
 
  
== اعتبارات التنفيذ ==
+
أضف إلى ذلك أنَّ هذه التوابع لا تستعمل مجموعة ملفات الضبط نفسها كما يفعل التابع [[Node.js/dns#dns.lookup.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|<code>dns.lookup()‎</code>]]. على سبيل المثال، نجد أنَّها لا تستعمل ملف الضبط الموجود في <code>/etc/hosts‎</code>.
رغم أنَّ التابع <code>dns.lookup()‎</code> والتوابع <code>dns.resolve*()/dns.reverse()‎</code> الأخرى لديها الهدف نفسه وهو ربط اسم شبكة معين بعنوانها (أو العكس) إلا أنَّ سلوك كل منهما مختلف بعض الشيء. قد تؤدي هذه الاختلافات إلى عواقب غامضة ولكن مهمة تؤثر على سلوك تطبيق Node.js ككل.
+
==مصادر==
=== <code>dns.lookup()‎</code> ===
+
*[https://nodejs.org/dist/latest-v10.x/docs/api/dns.html صفحة Crypto في توثيق Node.js الرسمي.]<noinclude>{{DISPLAYTITLE:الوحدة <code>‎‎‎DNS</code>‎ في Node.js}}</noinclude>
إن تعمَّقنا بعض الشيء، نجد أنَّ التابع <code>dns.lookup()‎</code> يستعمل نفس خدمات نظام التشغيل كما تفعل أغلب التطبيقات الأخرى. على سبيل المثال، يستبين التابع <code>dns.lookup()‎</code> الاسم المعطى بالطريقة نفسها تقريبًا بشكل دائم مثلما يفعل الأمر <code>ping‎</code>. في أغلب الأنظمة المتوافقة مع المعيار POSIX، يمكن تعديل سلوك التابع <code>dns.lookup()‎</code> عبر تغيير الإعدادات في <code>nsswitch.conf(5)‎</code> و/أو <code>resolv.conf(5)‎</code>، ولكن انتبه إلى أنَّ تغيير هذه الملفات سيُغيِّر سلوك جميع البرامج الأخرى التي تعمل على نظام التشغيل نفسه.
+
[[تصنيف: Node.js|{{SUBPAGENAME}}]]
رغم أنَّ استدعاء التابع <code>dns.lookup()‎</code> سيكون غير متزامن من وجهة نظر JavaScript إلا أنَّه يُنفَّذ كما لو كان استدعاءً متزامنًا للدالة <code>getaddrinfo(3)‎</code> التي تعمل على مجمع خيط (threadpool) المكتبة libuv. ويمكن أن يترتَّب على هذا الأمر آثارًا سلبيةً على الأداء لبعض التطبيقات. لمزيد من التفاصيل، اطلع على قسم الخيار <code>UV_THREADPOOL_SIZE‎</code> في توثيق خيارات سطر الأوامر في Node.js.
 
انتبه إلى أنَّ مختلف واجهات الشبكة البرمجية (networking APIs) ستستدعي التابع <code>dns.lookup()‎</code> بشكل داخلي لاستبيان أسماء المضيف. إن كان ذلك مشكلةً، فاعتمد على استبيان اسم المضيف إلى عنوان باستعمال التابع <code>dns.resolve()‎</code> واستخدم العناوين بدلًا من اسم المضيف. أضف إلى ذلك، بعض واجهة الشبكة البرمجية (مثل <code>socket.connect()‎</code> و <code>dgram.createSocket()‎</code>) تسمح باستبدال المستبين الافتراضي، الذي هو <code>dns.lookup()‎</code>.
 
=== التابع <code>dns.resolve()‎</code>، والتوابع <code>dns.resolve*()‎</code>، والتابع <code>dns.reverse()‎</code> ===
 
تنفَّذ هذه التوابع بشكل مختلف إلى حد كبير عن التابع <code>dns.lookup()‎</code>. إنها لا تستعمل الدالة <code>getaddrinfo(3)‎</code> وتنفِّذ أحد استعلامات DNS على الشبكة دومًا. تجري هذه الاتصالات على الشبكة بشكل غير متزامن دومًا، ولا ستعمل مجمع خيوط المكتبة libuv مطلقًا.
 
نتيجةً لذلك، لا يمكن أن يكون لهذه التوابع نفس التأثير السلبي على عمليات المعالجة الأخرى التي تقع في مجمع خيوط المكتبة libuv بخلاف التابع <code>dns.lookup()‎</code>.
 
أضف إلى ذلك أنَّ هذه التوابع لا تستعمل مجموعة ملفات الضبط نفسها كما يفعل التابع <code>dns.lookup()‎</code>. على سبيل المثال، نجد أنَّها لا تستعمل ملف الضبط الموجود في <code>/etc/hosts‎</code>.
 
== مصادر ==
 
* صفحة Crypto في توثيق Node.js الرسمي.
 
[[التصنيف: Node.js]]
 

المراجعة الحالية بتاريخ 11:17، 23 أكتوبر 2018

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

تحتوي الوحدة dns على دوال تخص فئتين مختلفتين هما:

  • الدوال التي تستعمل خدمات نظام التشغيل الضمنية لتنفيذ عملية استبيان الاسم (name resolution)، والتي لا تتطلب بالضرورة تنفيذ أية عمليات اتصال بالشبكة. تحوي هذه الفئة على دالة وحيدة هي dns.lookup()‎. يتطلع المطورون إلى تنفيذ عملية استبيان الاسم بالطريقة نفسها التي تُنفِّذ فيها التطبيقات الأخرى الدالة dns.lookup() على المنصة ذاتها عندما تضطر إلى استعمالها. تفحَّص المثال التالي الذي يُستعمَل فيه الدالة dns.lookup() للبحث عن iana.org‎:
const dns = require('dns');

dns.lookup('iana.org', (err, address, family) => {
  console.log('address: %j family: IPv%s', address, family);
});
// address: "192.0.43.8" family: IPv4
  • الدوال التي تتصل بخادم DNS حقيقي لتنفيذ عملية استبيان الاسم، والتي تستعمل دومًا الشبكة لتنفيذ استعلامات DNS. تتألف هذه الفئة من جميع الدوال الموجودة في الوحدة dns باستثناء الدالة dns.lookup(). لا تستعمل هذه الدوال مجموعة ملفات الضبط نفسها التي تستعملها الدالة dns.lookup() (مثل ‎/etc/hosts). يجب أن يستعمل هذه الدوال المطورون الذين لا يريدون أن يستخدموا خدمات نظام التشغيل الضمنية لاستبيان الاسم ولكن يريدون بدلًا من ذلك تنفيذ استعلامات DNS.
const dns = require('dns');

dns.resolve4('archive.org', (err, addresses) => {
  if (err) throw err;

  console.log(`addresses: ${JSON.stringify(addresses)}`);

  addresses.forEach((a) => {
    dns.reverse(a, (err, hostnames) => {
      if (err) {
        throw err;
      }
      console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`);
    });
  });
});

هنالك عواقب خفية في اختيار إحدى الفئتين دون الأخرى، لذا ارجع رجاءً إلى قسم «اعتبارات التنفيذ» في الأسفل للمزيد من المعلومات.

الصنف dns.Resolver‎

أضيف في الإصدار: v8.3.0.

يعدُّ الصنف dns.Resolver‎‎ مستبيِن مستقل (independent resolver) من أجل طلبات DNS.

انتبه إلى أنَّ المستبين المُنشَأ حديثًا يستعمل إعدادات الخادم الافتراضية. ضبط الخوادم المستعملة من أجل مستبين معيَّن عبر resolver.setServers()‎ ليس له تأثير على مستبينات أخرى:

const { Resolver } = require('dns');
const resolver = new Resolver();
resolver.setServers(['4.4.4.4']);

// This request will use the server at 4.4.4.4, independent of global settings.
resolver.resolve4('example.org', (err, addresses) => {
  // ...
});

التوابع التالية من الوحدة dns متاحةٌ حاليًا:

resolver.cancel()‎

أضيف في الإصدار: v8.3.0.

يلغي هذا التابع جميع استعلامات DNS المعلقة التي أنشأها هذا المستبين. ستُستدعَى دوال ردود النداء المقابلة مع خطأٍ رمزه ECANCELLED.

dns.getServers()‎

أضيف في الإصدار: v0.11.3.

يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار rtc5952، التي ضُبطَت آنذاك لتحليل DNS. ستتضمن السلسلة النصية جزءًا للمنفذ إن استخدم منفذ مخصص.

[
  '4.4.4.4',
  '2001:4860:4860::8888',
  '4.4.4.4:1053',
  '[2001:4860:4860::8888]:1053'
]

dns.lookup(hostname[, options], callback)‎

سجل التغييرات
الإصدار التغييرات
v1.2.0 أصبح الخيار all مدعومًا الآن.
v0.1.90 أضيف هذا التابع.
  • hostname‎:‏ <string>
  • options‎: ‏<integer>‏ | <Object>
    • family‎: ‏<integer> عائلة السجل. يجب أن يأخذ القيمة 4 أو 6. يعاد العنوان IPv4 والعنوان IPv6 كلاهما افتراضيًّا.
    • hints‎: ‏<number> واحدةٌ أو أكثر من الرايات getaddrinfo‎ المدعومة. يمكن تمرير رايات متعددة عبر دمجها باستعمال المعامل OR الثنائي.
    • all‎: ‏‏<boolean> عندما تكون قيمته true، يعيد رد النداء جميع العناوين المستبينة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: false.
    • verbatim‎: ‏<boolean> عندما تكون قيمته true، يستقبل رد النداء العناوين IPv4 و IPv6 بالترتيب الذي أعاده بهم المستبين DNS. عندما تكون قيمته false، توضع العناوين IPv4 قبل عناوين IPv6. القيمة الافتراضية حاليًا هي: false (أي يعاد ترتيب العناوين)، ولكن يُتوقع أن تتغير في المستقبل القريب. يجب أن تستعمل الشيفرات الجديدة القيمة { verbatim: true }‎.
  • callback‎: ‏<Function>
    • err‎: ‏<Error>
    • address‎: ‏<string> سلسلة نصية تمثل عناوين IPv4 أو IPv6.
    • family: ‏<integer> عدد صحيح قيمته إما 4 أو 6 يدُّل على عائلة العنوان address.

يستبين هذا التابع اسم المضيف (hostname) -مثل ‎'nodejs.org'‎- إلى أول سجل A (أي IPv4) أو AAAA (أي IPv6) يعثر عليه. إن كان الوسيط options عددًا صحيحًا، فيجب أن تكون قيمته 4 أو 6. أمَّا إن لم يُعطَ الوسيط options، فستُعاد العناوين IPv4 و IPv6 كلاهما حينئذٍ إن عُثِر عليها.

عند ضبط الخيار all إلى القيمة true، فستتغيَّر وسائط رد النداء callback إلى (err, addresses)‎ مع جعل الوسيط addresses مصفوفةً من كائنات لها الخاصيتين address و family.

في حال حصول خطأ، يكون الوسيط err‎ كائنًا من النوع Error‎، إذ يكون err.code‎ هو رمز الخطأ. تذكر دومًا أنَّ err.code‎ سيضبط إلى القيمة ‎'ENOENT'‎ ليس عندما لا يوجد اسم مضيف فقط ولكن عند فشل عملية البحث (lookup) أيضًا بطرق أخرى مثل عدم توافر واصفات للملف (file descriptors).

ليس بالضرورة أن تملك الدالة dns.lookup()‎ كل شيء مطلوب للعمل مع البروتوكول DNS، إذ يستعمل التنفيذ خدمات نظام التشغيل التي تستطيع ربط الأسماء بالعناوين والعكس بالعكس. لهذا التنفيذ عواقب غامضة ولكن مهمة تؤثِّر على سلوك أي تطبيق من تطبيقات Node.js. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم «اعتبارات التنفيذ» -في الأسفل- قبل استعمال التابع dns.lookup()‎.

const dns = require('dns');
const options = {
  family: 6,
  hints: dns.ADDRCONFIG | dns.V4MAPPED,
};
dns.lookup('example.com', options, (err, address, family) =>
  console.log('address: %j family: IPv%s', address, family));
// address: "2606:2800:220:1:248:1893:25c8:1946" family: IPv6

// When options.all is true, the result will be an Array.
options.all = true;
dns.lookup('example.com', options, (err, addresses) =>
  console.log('addresses: %j', addresses));
// addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}]

إن استدعي هذا التابع مثل نظيره util.promisify()‎ ولم يُضبَط الوسيط all إلى القيمة true، فسيُعيد كائنًا من النوع Promise لكائن Object‎ مع الخاصيتين address‎ و family.

الرايات getaddrinfo‎ المدعومة

يمكن استعمال الرايات التالية مع الوسيط hints‎ الممرر إلى التابع dns.lookup()‎:

  • dns.ADDRCONFIG‎: تحدِّد أنواع العناوين المعادة عبر أنواع العناوين المدعومة من قِبَل النظام الحالي. على سبيل المثال، تعاد العناوين IPv4 فقط إن كان النظام الحالي يملك عنوان IPv4 واحد مضبوط على الأقل. لا تؤخذ العناوين loopback بالحسبان.
  • dns.V4MAPPED‎: إن حُدِّدت عائلة العناوين IPv6 ولكن لم يُعثَر على عناوين IPv6، فستُعاد حينئذٍ العناوين IPv4 بعد تعيينها إلى عناوين IPv6. انتبه إلى أنَّ هذه الراية غير مدعومة على بعض أنظمة التشغيل (مثل FreeBSD 10.1).

dns.lookupService(address, port, callback)‎

أضيف في الإصدار: 0.11.14.

يستبين هذا التابع العنوان address والمنفذ port‎ المعطى إلى اسم مضيف (hostname) وخدمة (service) باستعمال التنفيذ getnameinfo‎ الضمني لنظام التشغيل. إن لم يكن الوسيط address‎ عنوان IP صالح، فسيُرمَى الخطأ TypeError‎. سيحوَّل المنفذ port‎ إلى عدد رغمًا عنه؛ فإن لم يكن منفذًا مقبولًا، فسيُرمى الخطأ TypeError‎. في حال حصول خطأ، يكون الوسيط err‎ كائنًا من النوع Error‎، إذ يكون err.code‎ هو رمز الخطأ.

const dns = require('dns');
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
  console.log(hostname, service);
  // localhost ssh :سيُطبع
});

إن استدعي هذا التابع مثل نظيره util.promisify()‎، فسيعيد كائنًا من النوع Promise للكائن Object‎ مع الخاصيتين address‎ و family.

dns.resolve(hostname[, rrtype], callback)‎

أضيف في الإصدار: v0.1.27.

يستعمل هذا التابع بروتوكول DNS للاستبيان عن اسم مضيف (مثل 'nodejs.org'‎) إلى مصفوفة من سجلات المصدر (resource records). يُمرَّر إلى الدالة callback‎ الوسيطين err‎ و records‎. عند نجاح العملية، سيكون records‎ مصفوفةً من سجلات المصدر. يختلف نوع وبنية النتائج الفردية التي نحصل عليها بناءً على قيمة الوسيط rrtype‎ وهي:

rrtype محتويات السجلات records نوع النتيجة التابع المختصر المقابل
'A' عناوين IPv4 (القيمة الافتراضية). <string> dns.resolve4()‎
'AAAA' عناوين IPv6. <string> dns.resolve6()‎
'ANY' أية سجلات. <Object> resolver.resolveAny()‎
'CNAME' سجلات الاسم المعياري (canonical name records). <string> dns.resolveCname()‎
'MX' سجلات تبادل البريد (mail exchange records). <Object> resolver.resolveMx()‎
'NAPTR' سجلات مؤشر اسم التفويض (name authority pointer records). <Object> dns.resolveNaptr()‎
'NS' سجلات خادم الأسماء (Name Server). <string> dns.resolveNs()‎
'PTR' سجلات المؤشر (pointer records). <string> dns.resolvePtr()‎
'SOA' بداية سجلات التفويض  (authority records). <Object> dns.resolveSoa()‎
'SRV' سجلات خدمة (service records). <Object> dns.resolveSrv()‎
'TXT' سجلات نصية (text records). <string[]‎> dns.resolveTxt()‎

في حال حصول خطأ، يكون الوسيط err‎ كائنًا من النوع Error‎، إذ يعدُّ err.code‎ أحد رموز الخطأ في DNS.

dns.resolve4(hostname[, options], callback)‎

سجل التغييرات
الإصدار التغييرات
v7.2.0 أصبح هذا التابع يدعم تمرير الوسيط options‎ خصوصًا options.ttl‎.
v0.1.16 أضيف هذا التابع.
  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.
  • options:‏ <Object>
    • ttl:‏ <boolean> استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، تستقبل دالة رد النداء مصفوفة من الكائنات { address: '1.2.3.4', ttl: 60 }‎ بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
  • callback:‏ <Function>

يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv4 (سجلات 'A') من أجل اسم المضيف hostname‎. سيحوي الوسيط addresses‎ المُمرَّر إلى الدالة callback‎ مصفوفةً من عناوين IPv4 (مثل ['74.125.79.104', '74.125.79.105', '74.125.79.106']‎).

dns.resolve6(hostname[, options], callback)‎

سجل التغييرات
الإصدار التغييرات
v7.2.0 أصبح هذا التابع يدعم تمرير الوسيط options‎ خصوصًا options.ttl‎.
v0.1.16 أضيف هذا التابع.
  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.
  • options:‏ <Object>
    • ttl:‏ <boolean> استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، تستقبل دالة رد النداء مصفوفة من الكائنات { address: '1.2.3.4', ttl: 60 }‎ بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.
  • callback:‏ <Function>

يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv6 (سجلات 'AAAA') من أجل اسم المضيف hostname‎. سيحوي الوسيط addresses‎ المُمرَّر إلى الدالة callback‎ مصفوفةً من عناوين IPv6.

dns.resolveAny(hostname, callback)‎

يستعمل هذا التابع بروتوكول DNS لاستبيان جميع السجلات (يُعرَف أيضًا بأنه استعلام ANY‎ أو *‎). سيحوي الوسيط ret المُمرَّر إلى الدالة callback‎ مصفوفةً تحتوي على مختلف أنواع السجلات. يملك كل سجل الخاصية type‎ التي تشير إلى نوع السجل الحالي. وبناءً على قيمة type‎، ستُعرَض خاصيات إضافية في الكائن هي:

النوع الخاصيات
'A' address/ttl
'AAAA' address/ttl
'CNAME' value
'MX' تشير إلى التابع dns.resolveMx()‎.
'NAPTR' تشير إلى التابع dns.resolveNaptr()‎‎.
'NS' value
'PTR' value
'SOA' تشير إلى التابع dns.resolveSoa()‎‎.
'SRV' تشير إلى التابع dns.resolveSrv()‎.
'TXT' يحتوي هذا النوع من السجل على خاصية مصفوفة تدعى entries تشير إلى dns.resolveTxt()‎ مثل { entries: ['...'], type: 'TXT' }.

لدينا مثالٌ عن تمرير الكائن ret‎ إلى دالة رد النداء:

[ { type: 'A', address: '127.0.0.1', ttl: 299 },
  { type: 'CNAME', value: 'example.com' },
  { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 },
  { type: 'NS', value: 'ns1.example.com' },
  { type: 'TXT', entries: [ 'v=spf1 include:_spf.example.com ~all' ] },
  { type: 'SOA',
    nsname: 'ns1.example.com',
    hostmaster: 'admin.example.com',
    serial: 156696742,
    refresh: 900,
    retry: 900,
    expire: 1800,
    minttl: 60 } ]

dns.resolveCname(hostname, callback)‎

أضيف في الإصدار: v0.3.2.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات MX‎) لاسم المضيف hostname‎. سيحوي الوسيط addresses المُمرَّر إلى الدالة callback‎ مصفوفةً من الكائنات التي تحتوي على الخاصية priority‎ والخاصية exchange‎ (مثل [{priority: 10, exchange: 'mx.example.com'}, ...]‎).

dns.resolveMx(hostname)‎

أضيف في الإصدار: v10.6.0.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات MX‎) لاسم المضيف hostname‎. سيحوي الوسيط addresses المُمرَّر إلى الدالة callback‎ مصفوفةً من الكائنات التي تحتوي على الخاصية priority‎ والخاصية exchange‎ (مثل [{priority: 10, exchange: 'mx.example.com'}, ...]‎).

dns.resolveNaptr(hostname, callback)‎

أضيف في الإصدار: v0.9.12.

يستعمل هذا التابع بروتوكول DNS لاستبيان السجلات القائمة على تعابير نمطية (سجلات NAPTR) لاسم المضيف hostname‎. سيحوي الوسيط addresses المُمرَّر إلى الدالة callback‎ مصفوفةً من كائناتٍ لها الخاصيات التالية:

  • flags‎
  • service
  • regexp
  • replacement
  • order
  • preference
{
  flags: 's',
  service: 'SIP+D2U',
  regexp: '',
  replacement: '_sip._udp.example.com',
  order: 30,
  preference: 100
}

dns.resolveNs(hostname, callback)‎

أضيف في الإصدار: v0.1.90.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات NS‎) لاسم المضيف hostname‎. سيحوي الوسيط addresses المُمرَّر إلى الدالة callback‎ مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف hostname‎ (مثل ['ns1.example.com', 'ns2.example.com']‎).

dns.resolvePtr(hostname, callback)‎

أضيف في الإصدار: v6.0.0.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات PTR) لاسم المضيف hostname‎. سيحوي الوسيط addresses المُمرَّر إلى الدالة callback‎ مصفوفةً من السلاسل النصية التي تحتوي على سجلات الرد (reply records).

dns.resolveSoa(hostname, callback)‎

أضيف في الإصدار: v0.11.10.

يستعمل هذا التابع بروتوكول DNS لاستبيان بداية سجل التفويض (سجل SOA) لاسم المضيف hostname‎. الوسيط addresses المُمرَّر إلى الدالة callback‎ هو كائنٌ يملك الخاصيات التالية:

  • nsname‎
  • hostmaster‎
  • serial‎
  • refresh‎
  • retry‎
  • expire‎
  • minttl‎
{
  nsname: 'ns.example.com',
  hostmaster: 'root.example.com',
  serial: 2013101809,
  refresh: 10000,
  retry: 2400,
  expire: 604800,
  minttl: 3600
}

dns.resolveSrv(hostname, callback)‎

أضيف في الإصدار: v0.1.27.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات خدمة (سجلات SRV) لاسم المضيف hostname‎. الوسيط addresses المُمرَّر إلى الدالة callback‎ هو مصفوفة من كائنات تمتلك الخاصيات التالية:

  • priority
  • weight
  • port
  • name
 
{
  priority: 10,
  weight: 5,
  port: 21223,
  name: 'service.example.com'
}

dns.resolveTxt(hostname, callback)‎

أضيف في الإصدار: v0.1.27.

يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات TXT) لاسم المضيف hostname‎. الوسيط addresses المُمرَّر إلى الدالة callback‎ هو مصفوفة ثنائية البعد من سجلات نصية لاسم المضيف hostname‎ (مثل [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]‎). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.

dns.reverse(ip, callback)‎

أضيف في الإصدار: 0.1.16.

ينفِّذ هذا التابع تعليمة DNS بشكل عكسي لاستبيان عناوين IPv4 أو IPv6 إلى مصفوفة من أسماء المضيفين.

عند حصول خطأ، يكون الوسيط err‎ كائنًا من النوع Error‎، إذ يعدُّ err.code‎ واحدًا من رموز الخطأ في DNS.

dns.setServers(servers)‎

أضيف في الإصدار: v0.11.3.

  • servers‎:‏ <string[]‎> مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار rfc5952.

يضبط هذا التابع العناوين IP ومنافذ الخوادم لاستعمالها عند تنفيذ استبيان DNS. الوسيط servers‎ هو مصفوفة من سلاسل نصية تمثِّل عناوينًا منسقةً وفقًا للتنسيق المحدد في المعيار rfc5952. إن كان المنفذ هو منفذ DNS الافتراضي الذي حددته IANA (وهو 53)، فيمكن حذفه.

dns.setServers([
  '4.4.4.4',
  '[2001:4860:4860::8888]',
  '4.4.4.4:1053',
  '[2001:4860:4860::8888]:1053'
]);

سيُرمَى خطأ إن أعطي عنوان غير صالح.

يجب ألا يُستدعَى التابع dns.setServers()‎ عندما تكون إحدى تعليمات DNS قيد المعالجة.

انتبه إلى أنَّ هذا التابع يعمل بشكل مشابه تقريبًا للدالة resolve.conf‎. هذا يعني أنَّه إن أعطت محاولة إجراء استبيان من أول خادم خطأً من النوع NOTFOUND‎، فلن يحاول التابع resolve()‎ إكمال عملية الاستبيان من الخوادم اللاحقة المعطاة. سيُلجَأ إلى استعادة خوادم DNS والرجوع إليها إن انتهت مهلة سابقاتها أو احتوى الناتج على أخطاء أخرى فقط.

واجهة وعود DNS البرمجية (DNS Promises API)

الاستقرار: 1-قيد التجريب.

توفِّر الواجهة dns.promises‎ البرمجية مجموعةً بديلةً لتوابع DNS غير المتزامنة التي تعيد كائنات من النوع Promise‎ بدلًا من استعمال ردود النداء. يمكن الوصول إلى الواجهة البرمجية عبر require('dns').promises‎.

الصنف dnsPromises.Resolver‎

أضيف في الإصدار: v10.6.0.

يعدُّ الصنف dnsPromises.Resolver‎‎ مستبينًا مستقلًا لطلبات DNS.

انتبه إلى أنَّه ستُستعمَل إعدادات الخادم الافتراضية عند إنشاء مستبين جديد. لا تؤثر عملية ضبط الخوادم التي يستعملها مستبين معيَّن عبر التابع resolver.setServers()‎ على بقية المستبينات:

 
const { Resolver } = require('dns').promises;
const resolver = new Resolver();
resolver.setServers(['4.4.4.4']);

// سيستعمل هذا الطلب الخادم عند 4.4.4.4 بشكل مستقل عن الإعدادات العامة
resolver.resolve4('example.org').then((addresses) => {
  // ...
});

// async-await بدلًا من ذلك، يمكن كتابة نفس الشيفرة باستعمال النمط 
(async function() {
  const addresses = await resolver.resolve4('example.org');
})();

توابع الواجهة dnsPromises‎ البرمجية المتاحة الآن هي:

dnsPromises.getServers()‎

أضيف في الإصدار: v0.11.3.

يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار rtc5952، التي ضُبطَت آنذاك لتحليل DNS. ستتضمن السلسلة النصية جزءًا للمنفذ إن استخدم منفذ مخصص.

[
  '4.4.4.4',
  '2001:4860:4860::8888',
  '4.4.4.4:1053',
  '[2001:4860:4860::8888]:1053'
]

dnsPromises.lookup(hostname[, options])‎

أضيف في الإصدار: v10.6.0.

  • hostname‎:‏ <string>
  • options‎: ‏<integer>‏ | <Object>
    • family‎: ‏<integer> عائلة السجل. يجب أن يأخذ القيمة 4 أو 6. يعاد العنوان IPv4 والعنوان IPv6 كلاهما افتراضيًّا.
    • hints‎: ‏<number> واحدةٌ أو أكثر من الرايات getaddrinfo‎ المدعومة. يمكن تمرير رايات متعددة عبر دمجها باستعمال المعامل OR الثنائي.
    • all‎: ‏‏<boolean> عندما تكون قيمته true، يُستبيَن الكائن Promise‎ مع جميع العناوين الموجودة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: false.
    • verbatim‎: ‏<boolean> عندما تكون قيمته true، يُستبيَن الكائن Promise‎ مع العناوين IPv4 و IPv6 بالترتيب الذي أعاده بهم مستبين DNS. عندما تكون قيمته false، توضع العناوين IPv4 قبل عناوين IPv6. القيمة الافتراضية حاليًا هي: false (أي يعاد ترتيب العناوين)، ولكن يُتوقع أن تتغير في المستقبل القريب. يجب أن تستعمل الشيفرات الجديدة القيمة { verbatim: true }‎.

يستبين هذا التابع اسم المضيف (hostname) -مثل 'nodejs.org'‎- إلى أول سجل A (أي IPv4) أو AAAA (أي IPv6) يعثر عليه. جميع خيارات الكائن option‎ هي اختيارية. إن كان الوسيط options عددًا صحيحًا، فيجب أن تكون قيمته 4 أو 6. أما إن لم يُعطَ الوسيط options، فستُعاد العناوين IPv4 و IPv6 كلاهما حينئذٍ إن عُثِر عليها. عند ضبط الخيار all إلى القيمة true، يُستبيَن الكائن Promise مع جعل الوسيط addresses‎ مصفوفةً من كائنات لها الخاصيتين address‎ و family‎.

في حال حصول خطأ، يُرفَض الكائن Promise مع كائن من النوع Error‎ إذ يكون err.code‎ رمز الخطأ. تذكر دومًا أنَّ err.code‎ سيُضبَط إلى القيمة ‎'ENOENT'‎ ليس عندما لا يوجد اسم مضيف فقط ولكن عند فشل عملية البحث (lookup) أيضًا بطرائق أخرى مثل عدم توافر واصفات للملف (file descriptors).

ليس بالضرورة أن تملك الدالة dns.lookup()‎ كل شيء مطلوب للعمل مع البروتوكول DNS، إذ يستعمل التنفيذ خدمات نظام التشغيل التي تستطيع ربط الأسماء بالعناوين والعكس بالعكس. لهذا التنفيذ عواقب غامضة ولكن مهمة تؤثر على سلوك أي تطبيق من تطبيقات Node.js. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم «اعتبارات التنفيذ» -في الأسفل- قبل استعمال التابع dns.lookup()‎.

const dns = require('dns');
const dnsPromises = dns.promises;
const options = {
  family: 6,
  hints: dns.ADDRCONFIG | dns.V4MAPPED,
};

dnsPromises.lookup('example.com', options).then((result) => {
  console.log('address: %j family: IPv%s', result.address, result.family);
  // address: "2606:2800:220:1:248:1893:25c8:1946" family: IPv6
});

// When options.all is true, the result will be an Array.
options.all = true;
dnsPromises.lookup('example.com', options).then((result) => {
  console.log('addresses: %j', result);
  // addresses: [{"address":"2606:2800:220:1:248:1893:25c8:1946","family":6}]
});

dnsPromises.lookupService(address, port)‎

أضيف في الإصدار: v10.6.0.

يستبين هذا التابع العنوان address والمنفذ port‎ المعطى إلى اسم مضيف (hostname) وخدمة (service) باستعمال التنفيذ getnameinfo‎ الضمني لنظام التشغيل.

إن لم يكن الوسيط address‎ عنوان IP صالح، فسيُرمى الخطأ TypeError‎. سيحوَّل المنفذ port‎ إلى عدد رغمًا عنه؛ فإن لم يكن منفذًا شرعيًّا، فسيُرمى الخطأ TypeError‎.

في حال حصول خطأ، يُرفَض الكائن Promise مع كائن من النوع Error‎، إذ يكون err.code‎ هو رمز الخطأ.

const dnsPromises = require('dns').promises;
dnsPromises.lookupService('127.0.0.1', 22).then((result) => {
  console.log(result.hostname, result.service);
  // Prints: localhost ssh
});

dnsPromises.resolve(hostname[, rrtype])‎

أضيف في الإصدار: v0.1.27.

  • hostname‎:‏ <string> اسم الضيف الذي سيُستبيَن.
  • rrtype‎:‏ <string> نوع سجل المصدر. القيمة الافتراضية هي: 'A'.

يستعمل هذا التابع بروتوكول DNS للاستبيان عن اسم مضيف (مثل 'nodejs.org'‎) إلى مصفوفة من سجلات المصدر (resource records). يُقبَل الكائن Promise‎ مع مصفوفة من سجلات المصدر عند نجاح العملية. يختلف نوع وبنية النتائج الفردية التي نحصل عليها بناءً على قيمة الوسيط rrtype‎ وهي:

rrtype محتويات السجلات records نوع النتيجة التابع المختصر المقابل
'A' عناوين IPv4 (القيمة الافتراضية). <string> dnsPromises.resolve4()‎
'AAAA' عناوين IPv6. <string> dnsPromises.resolve6()‎
'ANY' أية سجلات. <Object> dnsPromises.resolveAny()‎
'CNAME' سجلات الاسم المعياري (canonical name records). <string> dnsPromises.resolveCname()‎
'MX' سجلات تبادل البريد (mail exchange records). <Object> dnsPromises.resolveMx()‎
'NAPTR' سجلات مؤشر اسم التفويض (name authority pointer records). <Object> dnsPromises.resolveNaptr()‎
'NS' سجلات خادم الأسماء (Name Server). <string> dnsPromises.resolveNs()‎
'PTR' سجلات المؤشر (pointer records). <string> dnsPromises.resolvePtr()‎
'SOA' بداية سجلات التفويض  (authority records). <Object> dnsPromises.resolveSoa()
'SRV' سجلات خدمة (service records). <Object> dnsPromises.resolveSrv()‎
'TXT' سجلات نصية (text records). <string[]‎> dnsPromises.resolveTxt()‎

في حال حصول خطأ، يُرفَض الكائن Promise مع كائن من النوع Error‎، إذ يعدُّ err.code‎ أحد رموز الخطأ في DNS.

dnsPromises.resolve4(hostname[, options])‎

أضيف في الإصدار: v10.6.0.

  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.
  • options:‏ <Object>
    • ttl:‏ <boolean> استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، يُقبَل الكائن Promise‎ مع مصفوفة من الكائنات { address: '1.2.3.4', ttl: 60 }‎ بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.

يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv4 (سجلات 'A') من أجل اسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفةً من عناوين IPv4 (مثل ['74.125.79.104', '74.125.79.105', '74.125.79.106']‎).

dnsPromises.resolve6(hostname[, options])‎

أضيف في الإصدار: v10.6.0.

  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.
  • options:‏ <Object>
    • ttl:‏ <boolean> استرجاع قيمة «العمر» (TTL، اختصارٌ للعبارة Time-To-Live). عندما تكون قيمته true، يُقبَل الكائن Promise‎ مع مصفوفة من الكائنات { address: '1.2.3.4', ttl: 60 }‎ بدلًا من مصفوفة من السلاسل النصية، ومع التعبير عن «العمر» بالثواني.

يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv6 (سجلات 'AAAA') من أجل اسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفةً من عناوين IPv6.

dnsPromises.resolveAny(hostname)‎

  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.

يستعمل هذا التابع بروتوكول DNS لاستبيان جميع السجلات (يُعرَف أيضًا بأنه استعلام ANY‎ أو *‎). عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفةً تحتوي على مختلف أنواع السجلات. يملك كل سجل الخاصية type‎ التي تشير إلى نوع السجل الحالي. وبناءً على قيمة type‎، ستُعرَض خاصيات إضافية في الكائن هي:

النوع الخاصيات
'A' address/ttl
'AAAA' address/ttl
'CNAME' value
'MX' تشير إلى التابع dnsPromises.resolveMx()‎‎.
'NAPTR' تشير إلى التابع dnsPromises.resolveNaptr()‎‎.
'NS' value
'PTR' value
'SOA' تشير إلى التابع dnsPromises.resolveSoa().
'SRV' تشير إلى التابع dnsPromises.resolveSrv()‎‎.
'TXT' يحتوي هذا النوع من السجل على خاصية مصفوفة تدعى entries تشير إلى dnsPromises.resolveTxt()‎ مثل { entries: ['...'], type: 'TXT' }.

إليك مثالٌ عن الكائن الناتج:

[ { type: 'A', address: '127.0.0.1', ttl: 299 },
  { type: 'CNAME', value: 'example.com' },
  { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 },
  { type: 'NS', value: 'ns1.example.com' },
  { type: 'TXT', entries: [ 'v=spf1 include:_spf.example.com ~all' ] },
  { type: 'SOA',
    nsname: 'ns1.example.com',
    hostmaster: 'admin.example.com',
    serial: 156696742,
    refresh: 900,
    retry: 900,
    expire: 1800,
    minttl: 60 } ]

dnsPromises.resolveCname(hostname)‎

أضيف في الإصدار: v10.6.0.

  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات CNAME لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفةً من سجلات الاسم المعياري المتاحة لاسم المضيف hostname‎ (مثل ['bar.example.com']‎).

dnsPromises.resolveMx(hostname)‎

أضيف في الإصدار: v10.6.0.

  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات MX‎) لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفةً من الكائنات التي تحتوي على الخاصية priority‎ والخاصية exchange‎ (مثل [{priority: 10, exchange: 'mx.example.com'}, ...]‎).

dnsPromises.resolveNaptr(hostname)‎

أضيف في الإصدار: v10.6.0.

  • hostname‎:‏ <string> اسم المضيف المراد استبيناه.

يستعمل هذا التابع بروتوكول DNS لاستبيان السجلات القائمة على تعابير نمطية (سجلات NAPTR) لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفةً من كائنات لها الخاصيات التالية:

  • flags‎
  • service
  • regexp
  • replacement
  • order
  • preference
{
  flags: 's',
  service: 'SIP+D2U',
  regexp: '',
  replacement: '_sip._udp.example.com',
  order: 30,
  preference: 100
}

dnsPromises.resolveNs(hostname)‎

أضيف في الإصدار: v10.6.0.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات NS‎) لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف hostname‎ (مثل ['ns1.example.com', 'ns2.example.com']‎).

dnsPromises.resolvePtr(hostname)‎

أضيف في الإصدار: v10.6.0.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات PTR) لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفة من السلاسل النصية التي تحتوي على سجلات الرد (reply records).

dnsPromises.resolveSoa(hostname)‎

أضيف في الإصدار: v10.6.0.

يستعمل هذا التابع بروتوكول DNS لاستبيان بداية سجل التفويض (سجل SOA) لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع كائن يملك الخاصيات التالية:

  • nsname‎
  • hostmaster‎
  • serial‎
  • refresh‎
  • retry‎
  • expire‎
  • minttl‎
{
  nsname: 'ns.example.com',
  hostmaster: 'root.example.com',
  serial: 2013101809,
  refresh: 10000,
  retry: 2400,
  expire: 604800,
  minttl: 3600
}

dnsPromises.resolveSrv(hostname)‎

أضيف في الإصدار: v0.1.27.

يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات خدمة (سجلات SRV) لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفة من كائنات تمتلك الخاصيات التالية:

  • priority
  • weight
  • port
  • name
 
{
  priority: 10,
  weight: 5,
  port: 21223,
  name: 'service.example.com'
}

dnsPromises.resolveTxt(hostname)‎

أضيف في الإصدار: v0.1.27.

يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات TXT) لاسم المضيف hostname‎. عند نجاح العملية، يُقبَل الكائن Promise‎ مع مصفوفة ثنائية البعد من السجلات النصية المتوافرة لاسم المضيف hostname‎ (مثل [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]‎). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.

dnsPromises.reverse(ip)‎

أضيف في الإصدار: v10.6.0.

ينفِّذ هذا التابع تعليمة DNS بشكل عكسي لاستبيان عناوين IPv4 أو IPv6 إلى مصفوفة من أسماء المضيفين. عند حصول خطأ، يُرفَض الكائن Promise مع كائن من النوع Error‎، إذ يعدُّ err.code‎ واحدًا من رموز الخطأ في DNS.

dnsPromises.setServers(servers)‎

أضيف في الإصدار: v10.6.0.

  • servers‎:‏ <string[]‎> مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار rfc5952.

يضبط هذا التابع العناوين IP ومنافذ الخوادم لاستعمالها عند تنفيذ استبيان DNS. الوسيط servers‎ هو مصفوفة من سلاسل نصية تمثِّل عناوين منسقة وفقًا للتنسيق المحدد في المعيار rfc5952. إن كان المنفذ هو منفذ DNS الافتراضي الذي حددته IANA (وهو 53)، فيمكن حذفه حينئذٍ.

dnsPromises.setServers([
  '4.4.4.4',
  '[2001:4860:4860::8888]',
  '4.4.4.4:1053',
  '[2001:4860:4860::8888]:1053'
]);

سيُرمَى خطأ إن أعطي عنوان غير صالح.

يجب ألا يُستدعَى التابع dnsPromises.setServers()‎ عندما تكون إحدى تعليمات DNS قيد المعالجة.

انتبه إلى أنَّ هذا التابع يعمل بشكل مشابه تقريبًا للدالة resolve.conf‎. هذا يعني أنَّه إن أعطت محاولة إجراء استبيان من أول خادم خطأً من النوع NOTFOUND‎، فلن يحاول التابع resolve()‎ إكمال عملية الاستبيان من الخوادم اللاحقة المعطاة. سيُلجَأ إلى استعادة خوادم DNS والرجوع إليها إن انتهت مهلة سابقاتها أو احتوى الناتج على أخطاء أخرى فقط.

رموز الخطأ (Error codes)

يمكن لأي تعليمة من تعليمات DNS أن تعيد أحد رموز الخطأ التالية:

رمز الخطأ الوصف
dns.NODATA‎ أعاد خادم DNS ردًا دون احتوائه على أية بيانات
dns.FORMERR تعليمة مطالبات (claims) خادم DNS غير منسقة بشكل صحيح.
dns.SERVFAIL أعاد خادم DNS خطأ عام.
dns.NOTFOUND لم يُعثر على اسم النطاق (domain name).
dns.NOTIMP لا يُنفِّذ خادم DNS العملية المطلوبة.
dns.REFUSED رفض خادم DNS التعليمة.
dns.BADQUERY تعليمة DNS ذات تنسيق أو صيغة خطأ.
dns.BADNAME صيغة أو تنسيق اسم المضيف خطأ.
dns.BADFAMILY عائلة العنوان غير مدعومة.
dns.BADRESP رد DNS ذو تنسيق أو صيغة خطأ.
dns.CONNREFUSED لا يمكن الاتصال بخوادم DNS.
dns.TIMEOUT انتهت المهلة أثناء محاولة الاتصال بخوادم DNS.
dns.EOF نهاية الملف.
dns.FILE حصل خطأ أثناء القراءة من الملف.
dns.NOMEM نفدت الذاكرة.
dns.DESTRUCTION لقد دُمِّرَت القناة.
dns.BADSTR سلسلة نصية ذات تنسيق أو صيغة خطأ.
dns.BADFLAGS الرايات المحددة غير مقبولة.
dns.NONAME اسم المضيف المعطى ليس عدديًّا.
dns.BADHINTS الرايات hints‎ المحددة أو إحداها غير مقبولة.
dns.NOTINITIALIZED لم تنجز عملية تهيئة المكتبة c-ares بعد.
dns.LOADIPHLPAPI حصل خطأ أثناء تحميل الملف iphlpapi.dll.
dns.ADDRGETNETWORKPARAMS لم يُعثَر على الدالة GetNetworkParams.
dns.CANCELLED أُلغيَت تعليمة DNS.

اعتبارات التنفيذ

رغم أنَّ التابع dns.lookup()‎ والتوابع dns.resolve*()/dns.reverse()‎ الأخرى لديها الهدف نفسه وهو ربط اسم شبكة معين بعنوانها (أو العكس) إلا أنَّ سلوك كل منهما مختلف بعض الشيء. قد تؤدي هذه الاختلافات إلى عواقب غامضة ولكن مهمة تؤثر على سلوك تطبيق Node.js ككل.

dns.lookup()‎

إن تعمَّقنا بعض الشيء، نجد أنَّ التابع dns.lookup()‎ يستعمل نفس خدمات نظام التشغيل كما تفعل أغلب التطبيقات الأخرى. على سبيل المثال، يستبين التابع dns.lookup()‎ الاسم المعطى بالطريقة نفسها تقريبًا بشكل دائم مثلما يفعل الأمر ping‎. في أغلب الأنظمة المتوافقة مع المعيار POSIX، يمكن تعديل سلوك التابع dns.lookup()‎ عبر تغيير الإعدادات في nsswitch.conf(5) و/أو resolv.conf(5)‎، ولكن انتبه إلى أنَّ تغيير هذه الملفات سيُغيِّر سلوك جميع البرامج الأخرى التي تعمل على نظام التشغيل نفسه.

رغم أنَّ استدعاء التابع dns.lookup()‎ سيكون غير متزامن من وجهة نظر JavaScript إلا أنَّه يُنفَّذ كما لو كان استدعاءً متزامنًا للدالة getaddrinfo(3) التي تعمل على مجمع خيط (threadpool) المكتبة libuv. ويمكن أن يترتَّب على هذا الأمر آثارًا سلبيةً على الأداء لبعض التطبيقات. لمزيد من التفاصيل، اطلع على قسم الخيار UV_THREADPOOL_SIZE‎ في توثيق خيارات سطر الأوامر في Node.js.

انتبه إلى أنَّ مختلف واجهات الشبكة البرمجية (networking APIs) ستستدعي التابع dns.lookup()‎ بشكل داخلي لاستبيان أسماء المضيف. إن كان ذلك مشكلةً، فاعتمد على استبيان اسم المضيف إلى عنوان باستعمال التابع dns.resolve()‎ واستخدم العناوين بدلًا من اسم المضيف. أضف إلى ذلك، بعض واجهة الشبكة البرمجية (مثل socket.connect() و dgram.createSocket()‎) تسمح باستبدال المستبين الافتراضي، الذي هو dns.lookup()‎.

التابع dns.resolve()‎، والتوابع dns.resolve*()‎، والتابع dns.reverse()‎

تنفَّذ هذه التوابع بشكل مختلف إلى حد كبير عن التابع dns.lookup()‎. إنها لا تستعمل الدالة getaddrinfo(3)‎ وتنفِّذ أحد استعلامات DNS على الشبكة دومًا. تجري هذه الاتصالات على الشبكة بشكل غير متزامن دومًا، ولا ستعمل مجمع خيوط المكتبة libuv مطلقًا.

نتيجةً لذلك، لا يمكن أن يكون لهذه التوابع نفس التأثير السلبي على عمليات المعالجة الأخرى التي تقع في مجمع خيوط المكتبة libuv بخلاف التابع dns.lookup()‎.

أضف إلى ذلك أنَّ هذه التوابع لا تستعمل مجموعة ملفات الضبط نفسها كما يفعل التابع dns.lookup()‎. على سبيل المثال، نجد أنَّها لا تستعمل ملف الضبط الموجود في ‎/etc/hosts‎.

مصادر