【问题标题】:Error while returning value from async dns.lookup() function从异步 dns.lookup() 函数返回值时出错
【发布时间】:2020-03-19 16:42:21
【问题描述】:

我正在编写一个函数来验证 url 使用如下定义的 dns.lookup() 函数:

const dns = require('dns');

const verifyURL = (url) => {
  const protocolRegEx = /^https?:\/\/(.*)/i;
  const hostnameRegEx = /^([a-z0-9\-_]+\.)+[a-z0-9\-_]+/i;

  if (url.match(/\/$/i)) {
    url = url.slice(0,-1);
  }

  const protocol = url.match(protocolRegEx);
  if (!protocol) { 
    return false;
  }

  const hostname = protocol[1].match(hostnameRegEx);
  if (hostname) {
    dns.lookup(hostname[0], (err, adderss) => {
      if (err) return false;
      return adderss;
    })
  }
}

我正在尝试从传递给dns.lookup() 函数的callback 内部返回true 或false。

(async () => { 
  let x = await verifyURL('https://stackoverflow.com/')
  console.log(x);
})();

但是每次我运行这段代码时,我都会得到undefined 作为返回值。 我已经尝试过这个answer,但它不起作用。 请帮我。谢谢!!

【问题讨论】:

  • 我的理解是 async await 与 Promises 一起工作。您应该改用 DNS Promises API 吗?

标签: javascript node.js async-await dns


【解决方案1】:

您正在等待一个函数 verifyURL,它不会返回一个承诺。

一种选择是修改您的 verifyURL 函数以返回一个承诺。

  const verifyURL = (url) => {
    const protocolRegEx = /^https?:\/\/(.*)/i;
    const hostnameRegEx = /^([a-z0-9\-_]+\.)+[a-z0-9\-_]+/i;

    if (url.match(/\/$/i)) {
      url = url.slice(0,-1);
    }

    const protocol = url.match(protocolRegEx);
    if (!protocol) {
      return false;
    }

    const hostname = protocol[1].match(hostnameRegEx);

    //verify this! I add this to return false if !hostname
    if (!hostname) {
      return false
    }

    return new Promise((resolve, reject) => {
      dns.lookup(hostname[0], (err, address) => {
        if (err) {
          return reject(err);
        }
        // Here I resolve to address. You can resolve to true as you mention in your post.
        return resolve(address)
      });
    });
  }

您还应该处理对承诺的拒绝。 例如。寻找https://stackoverflow2.com 会给你一个错误“getaddrinfo ENOTFOUND stackoverflow2.com”

  (async () => {
    try {
      let x = await verifyURL('https://stackoverflow.com')
      console.log(x);
    } catch (e) {
      console.error(e.message)
    }
  })();

另一种选择是使用dns promise api

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2020-09-12
    • 2020-07-29
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多