الفرق بين المراجعتين لصفحة: «Node.js/dns»
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
(7 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
الاستقرار: 2-مستقر | الاستقرار: 2-مستقر | ||
تحتوي الوحدة <code>dns</code> على دوال تخص فئتين مختلفتين هما: | تحتوي الوحدة <code>dns</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>: | *الدوال التي تستعمل خدمات نظام التشغيل الضمنية لتنفيذ عملية استبيان الاسم (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>: | ||
<syntaxhighlight lang="javascript">const dns = require('dns'); | <syntaxhighlight lang="javascript">const dns = require('dns'); | ||
سطر 11: | سطر 10: | ||
// address: "192.0.43.8" family: IPv4 | // address: "192.0.43.8" family: IPv4 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* الدوال التي تتصل بخادم 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. | ||
<syntaxhighlight lang="javascript">const dns = require('dns'); | <syntaxhighlight lang="javascript">const dns = require('dns'); | ||
سطر 28: | سطر 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>[[Node.js/dns#dns.setServers.28servers.29.E2.80.8E|resolver.setServers()]]</code> ليس له تأثير على مستبينات أخرى: | انتبه إلى أنَّ المستبين المُنشَأ حديثًا يستعمل إعدادات الخادم الافتراضية. ضبط الخوادم المستعملة من أجل مستبين معيَّن عبر <code>[[Node.js/dns#dns.setServers.28servers.29.E2.80.8E|resolver.setServers()]]</code> ليس له تأثير على مستبينات أخرى:<syntaxhighlight lang="javascript"> | ||
<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> متاحةٌ حاليًا: | ||
التوابع التالية من الوحدة <code>dns</code> متاحةٌ حاليًا: | *<code>[[Node.js/dns#dns.getServers.28.29.E2.80.8E|resolver.getServers()]]</code> | ||
* <code>[[Node.js/dns#dns.getServers.28.29.E2.80.8E|resolver.getServers()]]</code> | *<code>[[Node.js/dns#dns.resolve.28hostname.5B.2C rrtype.5D.2C callback.29.E2.80.8E|resolver.resolve()]]</code> | ||
* <code>[[Node.js/dns#dns.resolve.28hostname.5B.2C rrtype.5D.2C callback.29.E2.80.8E|resolver.resolve()]]</code> | *<code>[[Node.js/dns#dns.resolve4.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|resolver.resolve4()]]</code> | ||
* <code>[[Node.js/dns#dns.resolve4.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|resolver.resolve4()]]</code> | *<code>[[Node.js/dns#dns.resolve6.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|resolver.resolve6()]]</code> | ||
* <code>[[Node.js/dns#dns.resolve6.28hostname.5B.2C options.5D.2C callback.29.E2.80.8E|resolver.resolve6()]]</code> | *<code>[[Node.js/dns#dns.resolveAny.28hostname.2C callback.29.E2.80.8E|resolver.resolveAny()]]</code> | ||
* <code>[[Node.js/dns#dns.resolveAny.28hostname.2C callback.29.E2.80.8E|resolver.resolveAny()]]</code> | *<code>[[Node.js/dns#dns.resolveCname.28hostname.2C callback.29.E2.80.8E|resolver.resolveCname()]]</code> | ||
* <code>[[Node.js/dns#dns.resolveCname.28hostname.2C callback.29.E2.80.8E|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>[[Node.js/dns#dns.resolveNaptr.28hostname.2C callback.29.E2.80.8E|resolver.resolveNaptr()]]</code> | *<code>[[Node.js/dns#dns.resolveNs.28hostname.2C callback.29.E2.80.8E|resolver.resolveNs()]]</code> | ||
* <code>[[Node.js/dns#dns.resolveNs.28hostname.2C callback.29.E2.80.8E|resolver.resolveNs()]]</code> | *<code>[[Node.js/dns#dns.resolvePtr.28hostname.2C callback.29.E2.80.8E|resolver.resolvePtr()]]</code> | ||
* <code>[[Node.js/dns#dns.resolvePtr.28hostname.2C callback.29.E2.80.8E|resolver.resolvePtr()]]</code> | *<code>[[Node.js/dns#dns.resolveSoa.28hostname.2C callback.29.E2.80.8E|resolver.resolveSoa()]]</code> | ||
* <code>[[Node.js/dns#dns.resolveSoa.28hostname.2C callback.29.E2.80.8E|resolver.resolveSoa()]]</code> | *<code>[[Node.js/dns#dns.resolveSrv.28hostname.2C callback.29.E2.80.8E|resolver.resolveSrv()]]</code> | ||
* <code>[[Node.js/dns#dns.resolveSrv.28hostname.2C callback.29.E2.80.8E|resolver.resolveSrv()]]</code> | *<code>[[Node.js/dns#dns.resolveTxt.28hostname.2C callback.29.E2.80.8E|resolver.resolveTxt()]]</code> | ||
* <code>[[Node.js/dns#dns.resolveTxt.28hostname.2C callback.29.E2.80.8E|resolver.resolveTxt()]]</code> | *<code>[[Node.js/dns#dns.reverse.28ip.2C callback.29.E2.80.8E|resolver.reverse()]]</code> | ||
* <code>[[Node.js/dns#dns.reverse.28ip.2C callback.29.E2.80.8E|resolver.reverse()]]</code> | *<code>[[Node.js/dns#dns.setServers.28servers.29.E2.80.8E|resolver.setServers()]]</code> | ||
* <code>[[Node.js/dns#dns.setServers.28servers.29.E2.80.8E|resolver.setServers()]]</code> | ===<code>resolver.cancel()</code>=== | ||
=== <code>resolver.cancel()</code> === | |||
أضيف في الإصدار: v8.3.0. | أضيف في الإصدار: v8.3.0. | ||
يلغي هذا التابع جميع استعلامات DNS المعلقة التي أنشأها هذا المستبين. ستُستدعَى دوال ردود النداء المقابلة مع خطأٍ رمزه <code>ECANCELLED</code>. | يلغي هذا التابع جميع استعلامات DNS المعلقة التي أنشأها هذا المستبين. ستُستدعَى دوال ردود النداء المقابلة مع خطأٍ رمزه <code>ECANCELLED</code>. | ||
== <code>dns.getServers()</code> == | ==<code>dns.getServers()</code>== | ||
أضيف في الإصدار: v0.11.3. | أضيف في الإصدار: v0.11.3. | ||
* القيم المعادة: [[JavaScript/String|<string[]>]] | *القيم المعادة: [[JavaScript/String|<string[]>]] | ||
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار | يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار [[rfc:5952#section-6|rtc5952]]، التي ضُبطَت آنذاك لتحليل DNS. ستتضمن السلسلة النصية جزءًا للمنفذ إن استخدم منفذ مخصص.<syntaxhighlight lang="text"> | ||
<syntaxhighlight lang="text"> | |||
[ | [ | ||
'4.4.4.4', | '4.4.4.4', | ||
سطر 78: | سطر 73: | ||
] | ] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== <code>dns.lookup(hostname[, options], callback)</code> == | ==<code>dns.lookup(hostname[, options], callback)</code>== | ||
{| class="wikitable mw-collapsible" | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |+سجل التغييرات | ||
سطر 90: | سطر 85: | ||
|أضيف هذا التابع. | |أضيف هذا التابع. | ||
|} | |} | ||
* <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>]] عندما تكون قيمته <code>true</code>، يعيد رد النداء جميع العناوين المستبينة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: <code>false</code>. | **<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>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>callback</code>: [[JavaScript/Function|<Function>]] | ||
** <code>err</code>: [[JavaScript/Error|<Error>]] | **<code>err</code>: [[JavaScript/Error|<Error>]] | ||
** <code>address</code>: [[JavaScript/String|<string>]] سلسلة نصية تمثل عناوين IPv4 أو IPv6. | **<code>address</code>: [[JavaScript/String|<string>]] سلسلة نصية تمثل عناوين IPv4 أو IPv6. | ||
** <code>family</code>: [[JavaScript/Number|<integer>]] عدد صحيح قيمته إما 4 أو 6 يدُّل على عائلة العنوان <code>address</code>. | **<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 كلاهما حينئذٍ إن عُثِر عليها. | يستبين هذا التابع اسم المضيف (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>. | عند ضبط الخيار <code>all</code> إلى القيمة <code>true</code>، فستتغيَّر وسائط رد النداء <code>callback</code> إلى <code>(err, addresses)</code> مع جعل الوسيط <code>addresses</code> مصفوفةً من كائنات لها الخاصيتين <code>address</code> و <code>family</code>. | ||
في حال حصول خطأ، يكون الوسيط <code>err</code> كائنًا من النوع <code>Error</code>، إذ يكون <code>err.code</code> هو رمز الخطأ. تذكر دومًا أنَّ <code>err.code</code> سيضبط إلى القيمة <code>'ENOENT'</code> ليس عندما لا يوجد اسم مضيف فقط ولكن عند فشل عملية البحث (lookup) أيضًا بطرق أخرى مثل عدم توافر واصفات للملف (file descriptors). | في حال حصول خطأ، يكون الوسيط <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. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم «<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>. | ليس بالضرورة أن تملك الدالة <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'); | ||
<syntaxhighlight lang="javascript">const dns = require('dns'); | |||
const options = { | const options = { | ||
family: 6, | family: 6, | ||
سطر 121: | سطر 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> ولم يُضبَط الوسيط <code>all</code> إلى القيمة <code>true</code>، فسيُعيد كائنًا من النوع <code>Promise</code> لكائن <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). | ||
بداية سجلات التفويض | |[[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. | |<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. | |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 }, | ||
سطر 283: | سطر 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', | ||
سطر 312: | سطر 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', | ||
سطر 351: | سطر 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"> | ||
{ | { | ||
سطر 369: | سطر 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', | ||
سطر 396: | سطر 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(); | ||
سطر 421: | سطر 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> | ===<code>dnsPromises.getServers()</code>=== | ||
أضيف في الإصدار: v0.11.3. | أضيف في الإصدار: v0.11.3. | ||
* القيم المعادة: [[JavaScript/String|<string[]>]] | *القيم المعادة: [[JavaScript/String|<string[]>]] | ||
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين IP، منسقةً وفقًا للمعيار | يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين 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', | ||
سطر 448: | سطر 468: | ||
] | ] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== < | ===<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>]] عندما تكون قيمته | **<code>all</code>: [[JavaScript/Boolean|<boolean>]] عندما تكون قيمته <code>true</code>، يُستبيَن الكائن <code>Promise</code> مع جميع العناوين الموجودة في مصفوفة. خلا ذلك، يعيد عنوانًا واحدًا فقط. القيمة الافتراضية هي: <code>false</code>. | ||
** <code>verbatim</code>: [[JavaScript/Boolean|<boolean>]] عندما تكون قيمته | **<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 إلى القيمة | |||
في حال حصول خطأ، يُرفَض الكائن <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. خذ بعض الوقت رجاءً لقراءة وتفحِّص القسم | |||
<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 = { | ||
سطر 479: | سطر 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); | ||
سطر 492: | سطر 513: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== <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>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). | ||
بداية سجلات التفويض | |[[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. | ||
=== < | ===<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' }, | ||
سطر 604: | سطر 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', | ||
سطر 631: | سطر 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', | ||
سطر 661: | سطر 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"> | ||
{ | { | ||
سطر 676: | سطر 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', | ||
سطر 697: | سطر 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 | |||
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>. | |||
==مصادر== | |||
*[https://nodejs.org/dist/latest-v10.x/docs/api/dns.html صفحة Crypto في توثيق Node.js الرسمي.]<noinclude>{{DISPLAYTITLE:الوحدة <code>DNS</code> في Node.js}}</noinclude> | |||
[[تصنيف: Node.js|{{SUBPAGENAME}}]] | |||
== مصادر == | |||
* صفحة 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.getServers()
resolver.resolve()
resolver.resolve4()
resolver.resolve6()
resolver.resolveAny()
resolver.resolveCname()
resolver.resolveMx()
resolver.resolveNaptr()
resolver.resolveNs()
resolver.resolvePtr()
resolver.resolveSoa()
resolver.resolveSrv()
resolver.resolveTxt()
resolver.reverse()
resolver.setServers()
resolver.cancel()
أضيف في الإصدار: v8.3.0.
يلغي هذا التابع جميع استعلامات DNS المعلقة التي أنشأها هذا المستبين. ستُستدعَى دوال ردود النداء المقابلة مع خطأٍ رمزه ECANCELLED
.
dns.getServers()
أضيف في الإصدار: v0.11.3.
- القيم المعادة: <string[]>
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين 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>
يستبين هذا التابع اسم المضيف (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
: <string>port
: <number>callback
: <Function>
يستبين هذا التابع العنوان 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.
hostname
: <string>rrtype
: <string>callback
: <Function>err
: <Error>records
: <string[]> | <Object[]> | <Object>
يستعمل هذا التابع بروتوكول 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>err
: <Error>addresses
: <string[]> | <Object[]>
يستعمل هذا التابع بروتوكول 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>err
: <Error>addresses
: <string[]> | <Object[]>
يستعمل هذا التابع بروتوكول DNS لاستبيان عناوين IPv6 (سجلات 'AAAA') من أجل اسم المضيف hostname
. سيحوي الوسيط addresses
المُمرَّر إلى الدالة callback
مصفوفةً من عناوين IPv6.
dns.resolveAny(hostname, callback)
hostname
: <string> اسم المضيف المراد استبيناه.callback
: <Function>err
: <Error>addresses
: <Object[]>
يستعمل هذا التابع بروتوكول 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.
hostname
: <string> اسم المضيف المراد استبيناه.callback
: <Function>err
: <Error>addresses
: <Object[]>
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات MX
) لاسم المضيف hostname
. سيحوي الوسيط addresses
المُمرَّر إلى الدالة callback
مصفوفةً من الكائنات التي تحتوي على الخاصية priority
والخاصية exchange
(مثل [{priority: 10, exchange: 'mx.example.com'}, ...]
).
dns.resolveMx(hostname)
أضيف في الإصدار: v10.6.0.
hostname
: <string> اسم المضيف المراد استبيناه.callback
: <Function>err
: <Error>addresses
: <Object[]>
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات البريد المتبادل (سجلات MX
) لاسم المضيف hostname
. سيحوي الوسيط addresses
المُمرَّر إلى الدالة callback
مصفوفةً من الكائنات التي تحتوي على الخاصية priority
والخاصية exchange
(مثل [{priority: 10, exchange: 'mx.example.com'}, ...]
).
dns.resolveNaptr(hostname, callback)
أضيف في الإصدار: v0.9.12.
hostname
: <string> اسم المضيف المراد استبيناه.callback
: <Function>err
: <Error>addresses
: <Object[]>
يستعمل هذا التابع بروتوكول 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.
hostname
: <string>callback
: <Function>err
: <Error>addresses
: <string[]>
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات NS
) لاسم المضيف hostname
. سيحوي الوسيط addresses
المُمرَّر إلى الدالة callback
مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف hostname
(مثل ['ns1.example.com', 'ns2.example.com']
).
dns.resolvePtr(hostname, callback)
أضيف في الإصدار: v6.0.0.
hostname
: <string>callback
: <Function>err
: <Error>addresses
: <string[]>
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات PTR
) لاسم المضيف hostname
. سيحوي الوسيط addresses
المُمرَّر إلى الدالة callback
مصفوفةً من السلاسل النصية التي تحتوي على سجلات الرد (reply records).
dns.resolveSoa(hostname, callback)
أضيف في الإصدار: v0.11.10.
hostname
: <string>callback
: <Function>
يستعمل هذا التابع بروتوكول 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.
hostname
: <string>callback
: <Function>err
: <Error>addresses
: <Object[]>
يستعمل هذا التابع بروتوكول 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.
hostname
: <string>callback
: <Function>err
: <Error>addresses
: <Object[]>
يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات TXT
) لاسم المضيف hostname
. الوسيط addresses
المُمرَّر إلى الدالة callback
هو مصفوفة ثنائية البعد من سجلات نصية لاسم المضيف hostname
(مثل [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.
dns.reverse(ip, callback)
أضيف في الإصدار: 0.1.16.
ip
: <string>callback
: <Function>err
: <Error>addresses
: <string[]>
ينفِّذ هذا التابع تعليمة 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
البرمجية المتاحة الآن هي:
resolver.getServers()
resolver.resolve()
resolver.resolve4()
resolver.resolve6()
resolver.resolveAny()
resolver.resolveCname()
resolver.resolveMx()
resolver.resolveNaptr()
resolver.resolveNs()
resolver.resolvePtr()
resolver.resolveSoa()
resolver.resolveSrv()
resolver.resolveTxt()
resolver.reverse()
resolver.setServers()
dnsPromises.getServers()
أضيف في الإصدار: v0.11.3.
- القيم المعادة: <string[]>
يعيد هذا التابع مصفوفةً من سلاسل نصية تمثِّل عناوين 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.
hostname
: <string>
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات اسم الخادم (سجلات NS
) لاسم المضيف hostname
. عند نجاح العملية، يُقبَل الكائن Promise
مع مصفوفةً من سجلات اسم الخادم المتوافرة لاسم للمضيف hostname
(مثل ['ns1.example.com', 'ns2.example.com']
).
dnsPromises.resolvePtr(hostname)
أضيف في الإصدار: v10.6.0.
hostname
: <string>
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات المؤشر (سجلات PTR
) لاسم المضيف hostname
. عند نجاح العملية، يُقبَل الكائن Promise
مع مصفوفة من السلاسل النصية التي تحتوي على سجلات الرد (reply records).
dnsPromises.resolveSoa(hostname)
أضيف في الإصدار: v10.6.0.
hostname
: <string>
يستعمل هذا التابع بروتوكول 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.
hostname
: <string>
يستعمل هذا التابع بروتوكول DNS لاستبيان سجلات خدمة (سجلات SRV
) لاسم المضيف hostname
. عند نجاح العملية، يُقبَل الكائن Promise
مع مصفوفة من كائنات تمتلك الخاصيات التالية:
priority
weight
port
name
{
priority: 10,
weight: 5,
port: 21223,
name: 'service.example.com'
}
dnsPromises.resolveTxt(hostname)
أضيف في الإصدار: v0.1.27.
hostname
: <string>
يستعمل هذا التابع بروتوكول DNS لاستبيان استعلامات نصية (سجلات TXT
) لاسم المضيف hostname
. عند نجاح العملية، يُقبَل الكائن Promise
مع مصفوفة ثنائية البعد من السجلات النصية المتوافرة لاسم المضيف hostname
(مثل [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
). تحتوي كل مصفوفة فرعية على قطع TXT لسجل واحد. بناءً على حالة الاستعمال، يمكن أن يُجمَّعوا سويةً أو يعاملوا بشكل منفصل.
dnsPromises.reverse(ip)
أضيف في الإصدار: v10.6.0.
ip
: <string>
ينفِّذ هذا التابع تعليمة 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
.