Module dns de Node.js
de Node.jsdnsmodule est un module principal pour les requêtes Domain Name System (DNS). DNS (Domain Name System) est un système qui convertit des noms de domaine lisibles par l’humain (tels quewww.example.com) en adresses IP lisibles par machine (telles que192.0.2.1).
Pourquoi avez-vous besoin du module dns
Dans les communications réseau, les ordinateurs s’identifient en réalité entre eux par des adresses IP, mais les personnes trouvent plus facile de mémoriser des noms de domaine que des adresses IP numériques.dnsLe module offre la possibilité d’effectuer la résolution de noms de domaine dans les applications Node.js, ce qui permet aux développeurs de :
- Résoudre des noms de domaine en adresses IP
- Résoudre inversement des adresses IP en noms de domaine
- Interroger des enregistrements DNS (MX, TXT, SRV, etc.)
Utilisation de base du module dns
Importer le module dns
Pour utiliser lednsmodule, vous devez d'abord l'importer :
Méthodes de résolution de base
dnsLe module fournit plusieurs méthodes de résolution. La plus couramment utilisée estlookupetresolve。
dns.lookup()
dns.lookup()est la méthode de résolution de domaine la plus simple. Elle utilise les fonctionnalités fournies par le système d'exploitation pour effectuer des requêtes DNS :
Exemple
if (err) throw err;
console.log(`address: ${address},version IP: IPv${family}`);
});
dns.resolve()
dns.resolve()offre un contrôle plus fin et peut interroger des types spécifiques d'enregistrements DNS :
Exemple
if (err) throw err;
console.log(`Enregistrement A: ${JSON.stringify(addresses)}`);
});
Méthodes principales du module dns
Résolution directe
La résolution directe est le processus de résolution d'un nom de domaine en une adresse IP :
Exemple
if (err) throw err;
console.log(`Adresse IPv4: ${addresses}`);
});
dns.resolve6('google.com', (err, addresses) => {
if (err) throw err;
console.log(`Adresse IPv6: ${addresses}`);
});
Résolution inverse
La résolution inverse est le processus de résolution d'une adresse IP en un nom de domaine :
Exemple
if (err) throw err;
console.log(`Résultat de la résolution inverse: ${hostnames}`);
});
Interrogation d'autres enregistrements DNS
dnsLe module prend également en charge l'interrogation d'autres types d'enregistrements DNS :
Exemple
dns.resolveMx('google.com', (err, addresses) => {
if (err) throw err;
console.log(`Enregistrement MX: ${JSON.stringify(addresses)}`);
});
// Enregistrement TXT (enregistrement texte)
dns.resolveTxt('google.com', (err, records) => {
if (err) throw err;
console.log(`Enregistrement TXT: ${JSON.stringify(records)}`);
});
Méthodes synchrones et asynchrones
Méthodes asynchrones
Par défaut,dnsLes méthodes du module sont asynchrones et utilisent des fonctions de rappel pour gérer les résultats :
Exemple
console.log('Résultat asynchrone :', address);
});
Version Promise
À partir de Node.js v10.6.0,dnsles méthodes du module fournissent également des versions basées sur les promesses :
Exemple
async function lookupExample() {
try {
const result = await dnsPromises.lookup('nodejs.org');
console.log('Résultat de la promesse :', result.address);
} catch (err) {
console.error(err);
}
}
lookupExample();
Gestion des erreurs
Les requêtes DNS peuvent échouer, il est donc très important de gérer correctement les erreurs :
Exemple
if (err) {
if (err.code === 'ENOTFOUND') {
console.log('Le domaine n’existe pas');
} else {
console.log('Erreur inconnue :', err);
}
return;
}
console.log('Adresse :', address);
});
Les codes d'erreur DNS courants incluent :
ENOTFOUND: le domaine n'existe pasESERVFAIL: le serveur DNS a renvoyé un échecETIMEOUT: la requête DNS a expiré
Exemples d’application pratique
Vérifier si un domaine peut être résolu
Exemple
return new Promise((resolve) => {
dns.lookup(domain, (err) => {
resolve(!err);
});
});
}
isDomainResolvable('google.com').then(result => {
console.log('Le domaine est résolvable :', result);
});
Résolution par lots des noms de domaine
Exemple
Promise.all(domains.map(domain => dnsPromises.lookup(domain)))
.then(results => {
results.forEach((result, index) => {
console.log(`${domains[index]} => ${result.address}`);
});
})
.catch(err => {
console.error('Échec de la résolution :', err);
});
Considérations de performance
Les requêtes DNS sont des opérations d'E/S et peuvent affecter les performances de l'application :
- Mettre en cache les résultats: Pour les domaines fréquemment interrogés, envisagez de mettre en cache les résultats au niveau de l'application
- Limites de concurrence: Évitez d'effectuer un grand nombre de requêtes DNS en même temps
- Paramètres de délai d'attente: Définissez un délai d'attente raisonnable pour les requêtes DNS
Exemple
async function cachedLookup(domain) {
if (cache.has(domain)) {
return cache.get(domain);
}
const result = await dnsPromises.lookup(domain);
cache.set(domain, result);
return result;
}
Méthode
| Méthode | Description | Exemple |
|---|---|---|
dns.lookup(hostname[, options], callback) | Résout un nom d'hôte en la première adresse IPv4 ou IPv6. Le paramètre facultatifoptionsest utilisé pour spécifier la méthode de résolution, telle quefamily(4 ou 6). | dns.lookup('example.com', (err, address) => {}); |
dns.resolve(hostname[, rrtype], callback) | Interroge les enregistrements DNS d'un type d'enregistrement spécifié, renvoyant les enregistrements A par défaut. Les types pris en charge incluent A, AAAA, MX, TXT, etc. | dns.resolve('example.com', 'MX', (err, addresses) => {}); |
dns.resolve4(hostname, callback) | Interroge les adresses IPv4 d'un nom d'hôte. | dns.resolve4('example.com', (err, addresses) => {}); |
dns.resolve6(hostname, callback) | Interroge les adresses IPv6 d'un nom d'hôte. | dns.resolve6('example.com', (err, addresses) => {}); |
dns.resolveMx(hostname, callback) | Interroge les enregistrements MX (échange de courrier) d'un nom d'hôte. | dns.resolveMx('example.com', (err, addresses) => {}); |
dns.resolveTxt(hostname, callback) | Interroge les enregistrements TXT (texte) d'un nom d'hôte. | dns.resolveTxt('example.com', (err, records) => {}); |
dns.reverse(ip, callback) | Résout une adresse IP en un nom d'hôte. | dns.reverse('8.8.8.8', (err, hostnames) => {}); |
dns.getServers() | Renvoie un tableau des serveurs DNS actuels. | console.log(dns.getServers()); |
dns.setServers(servers) | Définit un tableau personnalisé de serveurs DNS. | dns.setServers(['8.8.8.8', '8.8.4.4']); |
rrtypes
Ce qui suit répertorie les valeurs rrtypes valides dans la méthode dns.resolve() :
'A'Adresse IPv4, par défaut'AAAA'Adresse IPv6'MX'Enregistrements d'échange de courrier'TXT'Enregistrements texte'SRV'Enregistrements SRV'PTR'Utilisé pour la recherche inversée d'adresse IP'NS'Enregistrements de serveur de noms de domaine'CNAME'Enregistrements d'alias'SOA'Valeur initiale de l'enregistrement faisant autorité
Codes d'erreur
Chaque requête DNS peut renvoyer les codes d'erreur suivants :
dns.NODATA: Aucune donnée dans la réponse.dns.FORMERR: Erreur de format de requête.dns.SERVFAIL: Échec général.dns.NOTFOUND: Nom de domaine introuvable.dns.NOTIMP: L'opération demandée n'est pas implémentée.dns.REFUSED: Requête refusée.dns.BADQUERY: Erreur de format de requête.dns.BADNAME: Erreur de format de nom de domaine.dns.BADFAMILY: Protocole d'adresse non pris en charge.dns.BADRESP: Erreur de format de réponse.dns.CONNREFUSED: Impossible de se connecter au serveur DNS.dns.TIMEOUT: Délai d'attente dépassé lors de la connexion au serveur DNS.dns.EOF: Fin de fichier.dns.FILE: Erreur de lecture du fichier.dns.NOMEM: Débordement de mémoire.dns.DESTRUCTION: Canal détruit.dns.BADSTR: Erreur de format de chaîne.dns.BADFLAGS: Identificateur illégal.dns.NONAME: L'hôte donné n'est pas numérique.dns.BADHINTS: Identificateur HINTS illégal.dns.NOTINITIALIZED: La bibliothèque c-ares n'a pas été initialisée.dns.LOADIPHLPAPI: Erreur lors du chargement de iphlpapi.dll.dns.ADDRGETNETWORKPARAMS: Impossible de trouver la fonction GetNetworkParams.dns.CANCELLED: Requête DNS annulée.
Exemple
Voici quelques exemples de méthodes courantes du module dns, montrant comment interroger l'adresse IP d'un hôte, récupérer des enregistrements DNS, etc.
1. Utilisez dns.lookup() pour obtenir une adresse IP
Exemple
// Rechercher l'adresse IPv4 d'un domaine
dns.lookup('example.com', (err, address, famille) => {
if (err) throw err;
console.log(`Adresse IP: ${address},Famille d'adresses: IPv${family}`);
});
dns.lookup() est une interface simplifiée qui trouve la première adresse IPv4 ou IPv6 pour le nom d'hôte spécifié.
2. Utilisez dns.resolve() pour interroger différents types d'enregistrements DNS
Exemple
// Interroger les enregistrements MX
dns.resolve('example.com', 'MX', (err, addresses) => {
if (err) throw err;
console.log('Enregistrements MX :', addresses);
});
// Interroger les enregistrements TXT
dns.resolve('example.com', 'TXT', (err, records) => {
if (err) throw err;
console.log('Enregistrements TXT :', records);
});
En utilisant dns.resolve(), vous pouvez spécifier des types d'enregistrements (tels que MX, TXT, etc.) pour interroger différents enregistrements DNS.
3. Utiliser dns.reverse() pour une requête DNS inverse
Exemple
// Résoudre inversement une adresse IP en nom d'hôte
dns.reverse('8.8.8.8', (err, hostnames) => {
if (err) throw err;
console.log(Nom d'hôte de `8.8.8.8: ${hostnames}`);
});
La résolution inverse résout une adresse IP en un nom de domaine, souvent utilisée pour vérifier la correspondance entre un nom de domaine et une adresse IP.
4. Obtenir et définir les serveurs DNS
Exemple
// Obtenir la liste actuelle des serveurs DNS
console.log('Serveurs DNS actuels :', dns.getServers());
// Définir un serveur DNS personnalisé
dns.setServers(['1.1.1.1', '8.8.8.8']);
console.log('Nouveau serveur DNS :', dns.getServers());
Avec dns.getServers(), vous pouvez obtenir la liste des serveurs DNS actuellement configurés sur le système. dns.setServers() permet de définir des serveurs DNS personnalisés, afin que des services de résolution DNS spécifiques puissent être utilisés pour les requêtes.
Méthodes asynchrones et synchrones
- Méthodes asynchrones : telles que
dns.lookup()、dns.resolve()etc., non bloquantes, adaptées aux tâches concurrentes. - Méthodes synchrones : telles que
dns.lookupSync()、dns.resolve4Sync(), bloquantes, adaptées à une utilisation à petite échelle, à éviter dans les scénarios à forte concurrence.
Scénarios d'application pratiques
- Résolution de noms de domaine pour les applications web: Interroger l'adresse IP d'un nom de domaine sur le serveur pour récupérer des pages web ou des ressources.
- Vérification de la configuration du serveur de messagerie: Vérifier l'exactitude de la configuration du serveur de messagerie via les enregistrements MX.
- Anti-spam: Grâce à une requête DNS inverse, détectez si le serveur qui envoie des e-mails correspond au nom de domaine, ce qui permet d'identifier la source du spam.
- Équilibrage de charge: En résolvant les différentes adresses IP d'un nom de domaine, créez un schéma d'équilibrage de charge pour répartir le trafic entre plusieurs serveurs.
dnsLe module permet aux applications Node.js d'effectuer la résolution de noms de domaine et des requêtes DNS, leur donnant plus de flexibilité dans la gestion des communications réseau. Grâce à des interfaces asynchrones, les requêtes DNS peuvent être effectuées efficacement sans bloquer le thread principal.
Modules intégrés de Node.js