Ошибка при возврате значения из функции asyn c dns.lookup () - PullRequest
0 голосов
/ 19 марта 2020

Я пишу функцию для проверки 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;
    })
  }
}

Я пытаюсь вернуть либо true, либо false изнутри callback передается в функцию dns.lookup().

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

Но каждый раз, когда я запускаю этот код, я получаю undefined в качестве возвращаемого значения. Я уже попробовал этот ответ , но он не работает. Пожалуйста, помогите мне. Спасибо !!

1 Ответ

0 голосов
/ 23 марта 2020

Вы ожидаете функцию 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 обещание api

...