Node.js进修之路17——DNS模块引见

1. DNS

在Node.js中,供应DNS模块,以完成域名查找及域名剖析的处置惩罚。

  • DNS模块中,供应了三个主要领及一系列便利要领。
  • resolve要领:用于将一个域名剖析为一组DNS纪录。
  • reverse要领: 用于将IP地点转换为一组域名。
  • lookup要领: 用于将一个域名转换成IP地点。
  • DNS模块中的其他便利要领均为resolve要领的一种便利情势。

2. 运用resolve要领将域名剖析为DNS纪录

`DNS.resolve(domain, [rrtype], callback(err, address){…})`

  • domain参数为一个字符串,用于指定须要被剖析的域名,能够包含子域名。
  • rrtypr参数为一个字符串,用于指定须要猎取的纪录范例,可指定的纪录范例以下。

    • A,该参数值为默许值,当纪录范例为A时,该纪录将一个IPv4地点映照为一个域名。
    • AAAA,当纪录范例为AAAA时,该纪录将一个IPv6地点映照为一个域名。
    • CNAME,当纪录范例为CNAME时,示意该纪录为一个域名的别号纪录,比方,一个www.example.com域名纪录或许为一个example.com域名纪录额别号纪录。
    • MX,MX纪录指向一个运用SMTP的域中的邮件效劳器,比方,当你想person@domain.com邮件地点发送电子邮件时,domain.com域的MX纪录中保留了发送该邮件时的邮件效劳器地点。
    • TXT,TXT纪录是为该域名附加的形貌纪录。
    • SRV,SRV纪录用于为一个特定域中一切可用效劳供应信息。
    • PTR,PTR纪录用于反向地点剖析,该纪录将一个域名映照为一个IPv4地点。
    • NS,NS(Name Server)纪录是域名效劳器纪录,用来指定该域名由哪一个DNS效劳器举行剖析。
  • 回调函数有两个参数,err是域名剖析失利时触发的毛病对象,addresses参数为一个数组,个中存放了一切猎取到的DNS纪录。

3. 为resolve要领定制的种种便利要领

  • DNS.resolve4(domain, callback),猎取IPv4地点
  • DNS.resolve6(domain, callback),猎取IPv6地点
  • DNS.resolveMx(domain, callback),猎取MX纪录,邮件交流效劳器纪录
  • DNS.resolveTxt(domain, callback),猎取TXT纪录,域名附加的形貌纪录
  • DNS.resolveSrv(domain, callback),猎取SRV纪录,效劳纪录
  • DNS.resolveNs(domain, callback),猎取NS纪录,域名效劳器纪录
  • DNS.resolveCname(domain, callback),猎取别号纪录

4. 运用lookup要领查询IP地点

当运用resolve4要领或许resolve6要领时,因为callback参数值回调函数中的addresses参数值数组中存放着一切猎取到的IPv4地点或IPv6地点。因而DNS模块中供应了一个猎取第一个被发明的IPv4地点或许IPv6地点的lookup要领
`DNS.lookup(domain, [family], callback(err, addresses, family){…})`

  • domain参数为一个字符串,用于指定须要剖析的域名
  • family参数值为一个整数值,用于指定须要猎取的IP地点范例,可指定的参数值为46,默许参数值为null,示意既能够猎取IPv4,又能够猎取IPv6
  • 回调函数err参数值为猎取地点失利时触发的毛病对象,当域名不存在或查询失利时该毛病对象的code属性值为ENOENT
  • addresses参数值为一个字符串,为猎取到的IP地点
  • family参数值为4时,示意为一个IPv4地点,为6时,示意为一个IPv6地点。

5. 运用reverse要领反向剖析IP地点

DNS模块中,运用reverse要领将一个IP地点反向剖析为一组与该IP地点绑定的域名
`DNS.reverse(ip, callback(err, domains){…})`

  • ip参数值为一个字符串,用于指定须要剖析的IP地点
  • 回调函数的err为反向剖析地点失利后的毛病对象
  • domains参数值为一个数组,存放了一切猎取到的域名

6. DNS模块中的种种毛病代码

err参数值为实行种种剖析或反向剖析操纵时触发的毛病对象,可根据该毛病对象的code属性值,即触发的毛病代号推断出发了什么毛病

  • ENODATA:DNS效劳器返回一个没有数据的查询效果
  • EFORMERR:DNS效劳器发明客户端要求查询时运用了花样毛病的查询参数
  • ESERVFAIL:DNS效劳器实行查询操纵失利
  • ENOTFOUND:未发明任何域名
  • ENOTIMP:DNS效劳器不能举行客户端所要求的查询操纵
  • EREFUSED:DNS效劳器谢绝举行查询操纵
  • EBADQUERY:花样毛病的DNS查询
  • EBADNAME:域名花样毛病
  • EBADFAMILY:不支持的IP地点范例
  • EBADRESP:DNS回复的花样毛病
  • ECONNREFUSED:不能竖立与DNS效劳器之间的衔接
  • ETIMEOUT:与DNS效劳器之间竖立衔接超时
  • EEOF:已抵达文件底部
  • EFILE:读取文件失利
  • ENOMEM:没有充足的内存空间
  • EDESTRUCTION:通道已被烧毁
  • EBADSTR:字符串花样毛病
  • EBADFLAGS:指定了毛病的推断标志
  • ENONAME:指定的主机名不是数值花样的
  • EBADHINTS:指定的提醒标志无效
  • ENOTINITIALIZED:c-ares类库初始化事情还没有完成
  • ELOADIPHLPAPI:加载iphlpapi.dll时触发了一个毛病
  • EADDREGETNETWORKPARAMS:未发明GetNetworkParams函数
  • ECANCELLED:DNS查询操纵被作废

7. DNS模块的基础运用

const dns = require('dns');
let url = 'www.qq.com';

dns.resolve(url, 'A', (err, addresses) => {
    console.log(addresses);
    // IPv4地点 [ '103.7.30.123' ]
});

dns.resolve(url, 'AAAA', (err, addresses) => {
    console.log(addresses);
    // IPv6地点 [ '240e:e1:8100:28::2:16' ]
});
dns.resolveMx('qq.com', (err, addresses) => {
    console.log(addresses);
    // 邮件交流效劳器纪录
    // [ { exchange: 'mx2.qq.com', priority: 20 },
    //   { exchange: 'mx1.qq.com', priority: 30 },
    //   { exchange: 'mx3.qq.com', priority: 10 } ]
    
});

dns.resolveTxt('qq.com', (err, addresses) => {
    console.log(addresses);
    // 域名附加的形貌纪录
    // [ [ 'v=spf1 include:spf.mail.qq.com -all' ] ]
});

dns.resolveSrv('www.baidu.com', (err, addresses) => {
    console.log(addresses);
    // 效劳纪录
    // []
});

dns.resolveNs('www.github.com', (err, addresses) => {
    console.log(addresses);
    // 域名效劳器纪录
    // [ 'ns-421.awsdns-52.com',
    //  'ns-520.awsdns-01.net',
    //  'ns1.p16.dynect.net',
    //  'ns2.p16.dynect.net',
    //  'ns3.p16.dynect.net',
    //  'ns4.p16.dynect.net',
    //  'ns-1283.awsdns-32.org',
    //  'ns-1707.awsdns-21.co.uk' ]
});

dns.resolveCname('www.163.com', (err, addresses) => {
    console.log(addresses);
    // 猎取别号纪录
    // [ 'www.163.com.lxdns.com' ]
});


dns.lookup('google.com', 4, (err, address, family) => {
    // 查询IP地点
    // address,查询到的地点
    // family,IPv4或IPv6
    console.log(address);// 172.217.27.142
    console.log(family);// 4
});

dns.lookup('google.com', 6, (err, address, family) => {
    console.log(address);// 2404:6800:4008:803::200e
    console.log(family);// 6
});

dns.reverse('203.188.200.67', (err, domain) => {
    // 反向剖析IP地点
    console.log(domain);
    // [ 'media-router-fp1.prod.media.vip.tp2.yahoo.com' ]
});
    原文作者:Karuru
    原文地址: https://segmentfault.com/a/1190000013424394
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞