Node.js DNS Module

Node.js DNS

DNS মডিউল পরিচিতি

DNS (ডোমেইন নেম সিস্টেম) মডিউল Node.js-এ নামের রেজোলিউশনের জন্য কার্যকারিতা প্রদান করে।

এটি দুটি প্রধান API প্রদান করে:

কলব্যাক-ভিত্তিক API

ঐতিহ্যগত Node.js শৈলী কলব্যাক ফাংশন সহ

প্রতিশ্রুতি-ভিত্তিক API

dns.promises এর মাধ্যমে আধুনিক অ্যাসিঙ্ক/ওয়েট সাপোর্ট

মূল বৈশিষ্ট্য:

💡দ্রষ্টব্য:

ডিএনএস মডিউল দুটি স্বতন্ত্র মোডে কাজ করতে পারে - অপারেটিং সিস্টেমের সুবিধাগুলি ব্যবহার করে বা সরাসরি নেটওয়ার্ক ডিএনএস কোয়েরি চালানো।

এটি আপনার অ্যাপ্লিকেশনে হোস্টনাম রেজোলিউশন কিভাবে কাজ করে তা প্রভাবিত করে।

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 :

সারাংশ

Node.js DNS . :

আইপি ঠিকানা হিসাবে ডোমেন নাম দেখা

IP ঠিকানায় ডোমেন নাম সমাধান করা

বিভিন্ন DNS রেকর্ডের ধরন নির্ধারণ করা

A, AAAA, MX, TXT, ইত্যাদি

বিপরীত DNS লুকআপ চালানো হচ্ছে

ডোমেন নাম হিসাবে আইপি ঠিকানাগুলি সমাধান করা

নির্দিষ্ট সেটিংস সহ কাস্টম সমাধানকারী তৈরি করা

ঐচ্ছিক DNS সার্ভার এবং সেটিংস

দুটি API

কলব্যাক-ভিত্তিক এবং প্রতিশ্রুতি-ভিত্তিক

DNS মডিউল বোঝা এমন অ্যাপ্লিকেশনগুলির জন্য গুরুত্বপূর্ণ যেগুলিকে ডোমেন নামের দ্বারা নেটওয়ার্ক সংস্থানগুলির সাথে যোগাযোগ করতে, কাস্টম নাম রেজোলিউশন যুক্তি প্রয়োগ করতে বা ডোমেন-সম্পর্কিত তথ্য যাচাই করতে হবে৷

অনুশীলন করুন

ডোমেইন নেম সিস্টেম (DNS) এর সাথে কাজ করার জন্য ফাংশন প্রদান করে এমন মডিউলের নাম নির্বাচন করুন।

HTTP ব্লক
✗ ভুল! HTTP মডিউলটি ওয়েব অনুরোধগুলি পরিচালনা করতে ব্যবহৃত হয়, DNS কার্যকারিতা নয়
FS ভলিউম
✗ ভুল! FS মডিউল ফাইল সিস্টেম অপারেশন পরিচালনা করতে ব্যবহৃত হয়, DNS নয়
DNS মডিউল
✓ ঠিক আছে! DNS মডিউল হল সঠিক মডিউল যা ডোমেইন নেম সিস্টেম (DNS) এর সাথে কাজ করার জন্য ফাংশন প্রদান করে।
ওএস মডিউল
✗ ভুল! OS মডিউল অপারেটিং সিস্টেমের সাথে সম্পর্কিত ফাংশন প্রদান করে, DNS নয়