DNS মডিউল পরিচিতি
DNS (ডোমেইন নেম সিস্টেম) মডিউল Node.js-এ নামের রেজোলিউশনের জন্য কার্যকারিতা প্রদান করে।
এটি দুটি প্রধান API প্রদান করে:
কলব্যাক-ভিত্তিক API
ঐতিহ্যগত Node.js শৈলী কলব্যাক ফাংশন সহ
প্রতিশ্রুতি-ভিত্তিক API
dns.promises এর মাধ্যমে আধুনিক অ্যাসিঙ্ক/ওয়েট সাপোর্ট
মূল বৈশিষ্ট্য:
- IP ঠিকানাগুলিতে ডোমেন নামগুলি সমাধান করা (A/AAAA রেকর্ড)
- বিপরীত DNS লুকআপ সক্রিয় করা হচ্ছে (PTR রেকর্ড)
- বিভিন্ন DNS রেকর্ডের ধরন (MX, TXT, SRV, ইত্যাদি) জিজ্ঞাসা করা
- নির্দিষ্ট সেটিংস সহ কাস্টম DNS সমাধানকারী তৈরি করা
- প্রোগ্রামগতভাবে DNS সার্ভার সেটিংস কনফিগার করা হচ্ছে
দ্রষ্টব্য:
ডিএনএস মডিউল দুটি স্বতন্ত্র মোডে কাজ করতে পারে - অপারেটিং সিস্টেমের সুবিধাগুলি ব্যবহার করে বা সরাসরি নেটওয়ার্ক ডিএনএস কোয়েরি চালানো।
এটি আপনার অ্যাপ্লিকেশনে হোস্টনাম রেজোলিউশন কিভাবে কাজ করে তা প্রভাবিত করে।
DNS দিয়ে শুরু করা
এখানে একটি ডোমেনের আইপি ঠিকানা দেখতে DNS মডিউল ব্যবহার করার একটি দ্রুত উদাহরণ:
বেসিক ডিএনএস লুকআপ
const dns = require('dns');
// Look up a domain name
dns.lookup('example.com', (err, address, family) => {
if (err) {
console.error('Lookup error:', err);
return;
}
console.log(`IP address: ${address}`);
console.log(`IP version: IPv${family}`);
});
আমদানি এবং স্থাপন
DNS মডিউল ব্যবহার করার জন্য, আপনি একটি কলব্যাক বা প্রতিশ্রুতি-ভিত্তিক API ব্যবহার করে আপনার Node.js অ্যাপ্লিকেশনে এটি আমদানি করতে পারেন:
কলব্যাক-ভিত্তিক API
// Import the DNS module
const dns = require('dns');
// Example usage
dns.lookup('example.com', (err, address, family) => {
if (err) throw err;
console.log(`Resolved: ${address} (IPv${family})`);
});
প্রতিশ্রুতি-ভিত্তিক API (Node.js 10.0.0+)
// Import the promises API
const { promises: dns } = require('dns');
// Or: const dns = require('dns').promises;
// Example with async/await
async function lookupDomain(domain) {
try {
const address = await dns.lookup(domain);
console.log(`Resolved: ${address.address} (IPv${address.family})`);
} catch (err) {
console.error('Lookup failed:', err);
}
}
lookupDomain('example.com');
দ্রষ্টব্য:
প্রতিশ্রুতি-ভিত্তিক API সাধারণত নতুন কোডের জন্য পছন্দ করা হয় কারণ এটি আধুনিক অ্যাসিঙ্ক/অপেক্ষা পদ্ধতির সাথে আরও ভাল কাজ করে এবং আরও ভাল ত্রুটি পরিচালনা করে।
বেসিক ডিএনএস লুকআপ
DNS মডিউল ডোমেইন নাম এবং IP ঠিকানা খোঁজার জন্য বিভিন্ন পদ্ধতি প্রদান করে। সবচেয়ে সাধারণ ফাংশন হল:
dns.lookup()
হোস্টনামগুলি সমাধান করতে অপারেটিং সিস্টেমের সুবিধাগুলি ব্যবহার করে৷
dns.resolve*()
সরাসরি নাম সার্ভারে DNS ক্যোয়ারী চালায়
dns.reverse()
বিপরীত DNS লুকআপ সক্ষম করে (আইপি থেকে হোস্টনাম)
IP ঠিকানায় ডোমেন নাম সমাধান করা
const dns = require('dns');
// Callback-based API
dns.lookup('www.example.com', (err, address, family) => {
if (err) throw err;
console.log('IP address: %s', address);
console.log('IP version: IPv%s', family);
});
const dns = require('dns').promises;
// Promise-based API
async function lookupExample() {
try {
const result = await dns.lookup('www.example.com');
console.log('IP address:', result.address);
console.log('IP version: IPv' + result.family);
} catch (err) {
console.error('Lookup failed:', err);
}
}
lookupExample();
দ্রষ্টব্য:
dns.lookup() .
একটি ডোমেনের জন্য সমস্ত আইপি ঠিকানা দেখা
const dns = require('dns');
// Get all IPv4 addresses
dns.resolve4('www.google.com', (err, addresses) => {
if (err) throw err;
console.log('IPv4 addresses:');
addresses.forEach(address => {
console.log(` ${address}`);
});
// Perform a reverse lookup on the first IP
dns.reverse(addresses[0], (err, hostnames) => {
if (err) throw err;
console.log(`Reverse lookup for ${addresses[0]}:`);
hostnames.forEach(hostname => {
console.log(` ${hostname}`);
});
});
});
DNS রেকর্ডের ধরন
DNS মডিউল বিভিন্ন DNS রেকর্ড প্রকারের জন্য লুকআপ সমর্থন করে:
| পদ্ধতি | রেকর্ড টাইপ | ব্যাখ্যা |
|---|---|---|
| resolve4() | A | IPv4 ঠিকানা |
| resolve6() | AAAA | IPv6 ঠিকানা |
| resolveMx() | MX | মেইল বিনিময় রেকর্ড |
| resolveTxt() | TXT | টেক্সট রেকর্ড |
| resolveSrv() | SRV | পরিষেবা রেকর্ড |
| resolveNs() | NS | নাম সার্ভার রেকর্ড |
| resolveCname() | CNAME | Canonical name records |
| resolveSoa() | SOA | Start of authority records |
| resolvePtr() | PTR | Pointer records |
| resolveNaptr() | NAPTR | Name authority pointer records |
| resolveAny() | ANY | Any records |
উন্নত DNS ফাংশন
1. কাস্টম DNS রেজোলিউশন
DNS লুকআপের উপর আরও নিয়ন্ত্রণের জন্য নির্দিষ্ট সেটিংস সহ একটি কাস্টম DNS সমাধানকারী তৈরি করুন:
const dns = require('dns');
// Create a new resolver
const resolver = new dns.Resolver();
// Set custom server (Google's public DNS)
resolver.setServers(['8.8.8.8', '8.8.4.4']);
// Use the custom resolver
resolver.resolve4('www.example.com', (err, addresses) => {
if (err) throw err;
console.log('Addresses resolved using Google DNS:');
addresses.forEach(addr => {
console.log(` ${addr}`);
});
});
// See what servers are configured
console.log('Current resolver servers:', resolver.getServers());
দ্রষ্টব্য:
যখন আপনি সিস্টেমের ডিফল্টের পরিবর্তে নির্দিষ্ট ডিএনএস সার্ভার ব্যবহার করতে চান বা যখন বিভিন্ন লুকআপের জন্য বিভিন্ন সেটিংসের প্রয়োজন হয় তখন একটি কাস্টম সমাধানকারী তৈরি করা কার্যকর।
2. নেটওয়ার্ক বনাম অপারেটিং সিস্টেম স্তর নির্ধারণ
DNS মডিউল নামের রেজোলিউশনে দুটি ভিন্ন পদ্ধতি প্রদান করে:
| ফাংশন | বাস্তবায়ন | নেটওয়ার্ক কল | ব্যবহার করে |
|---|---|---|---|
| dns.lookup() | getaddrinfo() সিস্টেম কল ব্যবহার করে | কোন সরাসরি নেটওয়ার্ক কল | স্থানীয় কনফিগারেশন অনুসরণ করে (হোস্ট ফাইল, ইত্যাদি) |
| dns.resolve*(), dns.reverse() | প্রকৃত নেটওয়ার্ক অনুরোধ করে | সর্বদা DNS সার্ভারের সাথে সংযোগ করা হচ্ছে | স্থানীয় কনফিগারেশন, সরাসরি DNS প্রশ্ন এড়িয়ে যায় |
সতর্কতা:
এই পার্থক্যগুলির কারণে, dns.lookup() এবং dns.resolve*() পদ্ধতির ফলাফল সবসময় মেলে না, বিশেষ করে কাস্টম হোস্ট কনফিগারেশনের পরিবেশে।
3. ত্রুটি হ্যান্ডলিং এবং পুনরায় চেষ্টা
শক্তিশালী DNS ম্যানিপুলেশন সঠিক ত্রুটি ব্যবস্থাপনা প্রয়োজন. সাধারণ DNS ত্রুটিগুলি কীভাবে পরিচালনা করবেন এবং পুনরায় চেষ্টা করার যুক্তি প্রয়োগ করবেন তা এখানে রয়েছে:
const dns = require('dns');
function lookupWithErrorHandling(domain) {
dns.lookup(domain, (err, address, family) => {
if (err) {
console.error(`DNS lookup failed for ${domain}`);
// Check specific error codes
switch (err.code) {
case 'ENOTFOUND':
console.error(' Domain name not found');
break;
case 'ETIMEDOUT':
console.error(' DNS lookup timed out');
break;
case 'ENODATA':
console.error(' Domain exists but no data of requested type');
break;
case 'ESERVFAIL':
console.error(' DNS server returned general failure');
break;
default:
console.error(` Error code: ${err.code}`);
}
return;
}
console.log(`DNS lookup successful for ${domain}`);
console.log(` IP address: ${address}`);
console.log(` IP version: IPv${family}`);
});
}
// Test with valid and invalid domains
lookupWithErrorHandling('www.google.com');
lookupWithErrorHandling('this-domain-does-not-exist-123456789.com');
দ্রষ্টব্য:
নেটওয়ার্ক সমস্যা বা DNS প্রচার বিলম্বের কারণে DNS ত্রুটিগুলি অস্থায়ী হতে পারে৷
উত্পাদন অ্যাপ্লিকেশনগুলিতে, আপনি সূচকীয় রোলব্যাকের সাথে পুনরায় চেষ্টা করার যুক্তি প্রয়োগ করতে চাইতে পারেন।
কর্মক্ষমতা অপ্টিমাইজেশান
ডিএনএস লুকআপগুলি অ্যাপ্লিকেশনগুলিতে একটি কর্মক্ষমতা বাধা হতে পারে। এখানে DNS রেজোলিউশন উন্নত করার কৌশল রয়েছে:
1. Caching
একই ডোমেনের জন্য বারবার লুকআপ এড়াতে একটি সাধারণ DNS ক্যাশে প্রয়োগ করুন:
const dns = require('dns');
const util = require('util');
const lookup = util.promisify(dns.lookup);
const dnsCache = new Map();
async function cachedLookup(domain) {
if (dnsCache.has(domain)) {
console.log('Cache hit for:', domain);
return dnsCache.get(domain);
}
console.log('Cache miss for:', domain);
const result = await lookup(domain);
dnsCache.set(domain, result);
return result;
}
// Example usage
(async () => {
const domains = ['google.com', 'facebook.com', 'google.com'];
for (const domain of domains) {
const result = await cachedLookup(domain);
console.log(`${domain} → ${result.address}`);
}
})();
2. Parallel Lookups
সমান্তরালে একাধিক DNS লুকআপ চালানোর জন্য Promise.all() ব্যবহার করুন:
const dns = require('dns').promises;
async function lookupMultiple(domains) {
try {
const lookups = domains.map(domain => dns.lookup(domain));
const results = await Promise.all(lookups);
return domains.map((domain, i) => ({
domain,
...results[i]
}));
} catch (err) {
console.error('One or more lookups failed:', err);
throw err;
}
}
// Example usage
lookupMultiple(['google.com', 'facebook.com', 'github.com'])
.then(results => console.log(results))
.catch(console.error);
3. কাস্টম সমাধানকারী এবং সময়সীমা
ভাল নিয়ন্ত্রণের জন্য কাস্টম DNS সার্ভার এবং টাইমআউট কনফিগার করুন:
const dns = require('dns');
const { Resolver } = dns;
// Create a custom resolver with timeout
const resolver = new Resolver();
resolver.setServers(['8.8.8.8', '1.1.1.1']); // Google and Cloudflare DNS
// Set timeout for all operations (in ms)
const TIMEOUT = 2000;
async function resolveWithTimeout(domain, rrtype = 'A') {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
reject(new Error(`DNS query timed out after ${TIMEOUT}ms`));
}, TIMEOUT);
resolver.resolve(domain, rrtype, (err, addresses) => {
clearTimeout(timer);
if (err) return reject(err);
resolve(addresses);
});
});
}
// Example usage
resolveWithTimeout('example.com')
.then(console.log)
.catch(console.error);
DNS মডিউল বনাম তৃতীয় পক্ষের DNS লাইব্রেরি
| বৈশিষ্ট্য | Node.js DNS | তৃতীয় পক্ষের লাইব্রেরি |
|---|---|---|
| ইনস্টলেশন | অন্তর্নির্মিত, কোন নির্ভরতা নেই | ইনস্টলেশন এবং ব্যবস্থাপনা প্রয়োজন |
| ফিচার সেট | মৌলিক DNS ফাংশন | প্রায়ই খুব বিস্তারিত |
| Caching | কনফিগার করা হয়নি | বেশিরভাগই ক্যাশে জড়িত |
| উন্নত বৈশিষ্ট্য | সংজ্ঞায়িত | DNSSEC, DoH, DoT সমর্থন অন্তর্ভুক্ত থাকতে পারে |
| কর্মক্ষমতা | মৌলিক ব্যবহারের জন্য ভাল | নির্দিষ্ট ব্যবহারের ক্ষেত্রে অপ্টিমাইজ করা যেতে পারে |
Node.js third-party DNS :
- dns-packet:নিম্ন-স্তরের DNS প্যাকেট এনক্রিপশন/ডিক্রিপশন
- native-dns:আরও সম্পূর্ণ DNS বাস্তবায়ন
- dns2:প্রতিশ্রুতি সমর্থন সহ একটি আধুনিক DNS লাইব্রেরি
সারাংশ
Node.js DNS . :
আইপি ঠিকানা হিসাবে ডোমেন নাম দেখা
IP ঠিকানায় ডোমেন নাম সমাধান করা
বিভিন্ন DNS রেকর্ডের ধরন নির্ধারণ করা
A, AAAA, MX, TXT, ইত্যাদি
বিপরীত DNS লুকআপ চালানো হচ্ছে
ডোমেন নাম হিসাবে আইপি ঠিকানাগুলি সমাধান করা
নির্দিষ্ট সেটিংস সহ কাস্টম সমাধানকারী তৈরি করা
ঐচ্ছিক DNS সার্ভার এবং সেটিংস
দুটি API
কলব্যাক-ভিত্তিক এবং প্রতিশ্রুতি-ভিত্তিক
DNS মডিউল বোঝা এমন অ্যাপ্লিকেশনগুলির জন্য গুরুত্বপূর্ণ যেগুলিকে ডোমেন নামের দ্বারা নেটওয়ার্ক সংস্থানগুলির সাথে যোগাযোগ করতে, কাস্টম নাম রেজোলিউশন যুক্তি প্রয়োগ করতে বা ডোমেন-সম্পর্কিত তথ্য যাচাই করতে হবে৷