【问题标题】:Is there an equivalent function of nslookup command in node.js?node.js中是否有nslookup命令的等效功能?
【发布时间】:2018-05-12 16:28:20
【问题描述】:

node.js中有nslookup的等价功能吗?

这是我的 MacBook Pro 上nslookup 命令的执行结果:

> nslookup www.amagicshop.com.tw 8.8.8.8
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
www.amagicshop.com.tw   canonical name = s16959.dname.91app.io.
s16959.dname.91app.io   canonical name = proxy.letssl.91app.io.
proxy.letssl.91app.io   canonical name = proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com.
Name:   proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com
Address: 54.178.248.57
Name:   proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com
Address: 52.196.80.17

我想知道 node.js 中是否有一个函数,给定www.amagicshop.com.tw8.8.8.8 作为输入,也返回
s16959.dname.91app.io.proxy.letssl.91app.io.proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com.52.196.80.1754.178.248.57 作为输出。

我原本以为dns.resolveAny是node.js中nslookup的等价函数。但我错了。

因为下面的代码返回Error: queryAny ESERVFAIL www.amagicshop.com.tw错误。

const { Resolver } = require('dns')
const resolver = new Resolver()
resolver.setServers(['8.8.8.8'])

resolver.resolveAny('www.amagicshop.com.tw', (err, result) => {
  if (err) {
    console.error(`error: ${err}`)
  } else {
    console.log(`result:  ${JSON.stringify(result)}`)
  }
})

结果与nslookup的结果不同。

也许我必须实现一个结合resolveCnameresolve4 的函数,这样我才能实现我想要的。

【问题讨论】:

    标签: node.js dns nslookup


    【解决方案1】:

    为了获得我们必须递归调用的所有规范名称(在nslookup 中,定义也是递归的!)。

    CNAME

    const dns = require('dns')
    
    let accum = []
    const getCnames = (err, result) => {
      if (err) {
        // no more records
        console.log(accum)
        return accum
      } else {
        const cname = result[0]
        accum.push(cname)
        return dns.resolveCname(cname, getCnames)
      }
    }
    
    dns.resolveCname('www.amagicshop.com.tw', getCnames)
    

    输出

    [ 's16959.dname.91app.io',
      'proxy.letssl.91app.io',
      'proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com' ]
    

    IP 地址

    dns.resolve('www.amagicshop.com.tw', callback=(err, result) => {
    
    if (err) {
        console.error(`error: ${err}`)
      } else {
        console.log(result)
      }
    })
    

    输出

    [ '52.196.80.17', '54.178.248.57' ]
    

    结合

    const dns = require('dns')
    
    const resolve = (cname) => {
      const getIp = (accum) =>
        dns.resolve(cname,
          callback=(err, result) => {
            if (err) {
                console.error(`error: ${err}`)
              } else {
                result.push.apply(result, accum)
                console.log(result)
              }
          })
    
      let accum = []
      const getCnames = (err, result) => {
        if (err) {
          // no more records
          getIp(accum)
        } else {
          const cname = result[0]
          accum.push(cname)
          dns.resolveCname(cname, getCnames)
        }
      }
    
      dns.resolveCname(cname, getCnames)
    }
    
    resolve('www.amagicshop.com.tw')
    

    输出

    [ '52.196.80.17',
      '54.178.248.57',
      's16959.dname.91app.io',
      'proxy.letssl.91app.io',
      'proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com' ]
    

    【讨论】:

    • lookup 的输出不包含 s16959.dname.91app.io.proxy.letssl.91app.io.proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com.。所以这不是我要找的东西。
    • resolveCname 不会在其输出中返回 proxy.letssl.91app.io.proxy-letssl-91app-io-196811564.ap-northeast-1.elb.amazonaws.com.52.196.80.1754.178.248.57
    • 它们可能都是来自 DNS 模块的可用解析器方法 - nodejs.org/api/dns.html
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多