С https, как я могу обусловить код состояния undefined? - PullRequest
1 голос
/ 31 марта 2020

Пытаюсь проверить код состояния HTTP в модуле, но мой первый ответ всегда undefined:

foo. js

const pass = require('./bar')
const test = pass('https://www.google.com/') // URL for testing will be API URL

console.log(`The return is: ${test}`)

бар. js

попытка 1:

module.exports = (url) => {
  https
    .get(url, (res) => {
      console.log(res.statusCode)
      if (typeof res.statusCode !== 'undefined' && res.statusCode.toString()[0] === '2') {
       console.log(`Results: ${res.statusCode}`)
       return true
      }
      function waiting(status) {
        if (typeof status !== 'undefined') {
          console.log('run timeout')
          setTimeout(waiting, 250)
        } else {
          console.log(`Results: ${status}`)
          return true
        }
      }
    })
    .on('error', (e) => {
      console.error(`Error ${e}`)
      return false
    })
}

попытка 2:

module.exports = (url) => {
  https
    .get(url, (res) => {
      console.log(res.statusCode)
      function waiting(status) {
        if (typeof status !== 'undefined') {
          console.log('run timeout')
          setTimeout(waiting, 250)
        } else {
          console.log(`Results: ${status}`)
          return true
        }
      }
    })
    .on('error', (e) => {
      console.error(`Error ${e}`)
      return false
    })
}

другие попытки обнаружить undefined:

if (typeof res.statusCode === 'number' && res.statusCode !== undefined && res.statusCode !== null) {

if (!res.statusCode) {

if (typeof res.statusCode !== 'undefined') {
  console.log(`Results: ${res.statusCode}`)
  if (res.statusCode.toString()[0] === '2') return true
  return false
}

Исследования:

Что я делаю не так? В моем модуле, как я могу проверить код состояния после undefined, чтобы я мог вернуть true или false из действительного числового значения?

1 Ответ

0 голосов
/ 01 апреля 2020

В обеих ваших попытках ваша экспортированная функция в баре. js ничего не возвращает. Поскольку вы вызываете асинхронную функцию c (https.get), вам необходимо, чтобы экспортируемая функция также была асин c. Вы можете конвертировать свою функцию, используя обещания и использовать async / await на вызывающей стороне. Например,

foo. js

const pass = require('./bar');

(async function() {
    const test = await pass('https://www.google.com/'); // URL for testing will be API URL

    console.log(`The return is: ${test}`);
})();

Обратите внимание на IFEE для получения асинхронной c области в соответствии с: с использованием await в глобальной области без ключевого слова asyn c

бар. js

const https = require('https');

module.exports = (url) => {
    return new Promise((resolve, reject) => {
        https
        .get(url, (res) => {
            console.log(res.statusCode)
            if (typeof res.statusCode !== 'undefined' && res.statusCode.toString()[0] === '2') {
                console.log(`Results: ${res.statusCode}`)
                resolve(true)
            } else {
                resolve(false)
            }
        })
        .on('error', (e) => {
            console.error(`Error ${e}`)
            resolve(false)
        })
    });
}

В качестве альтернативы , вы можете использовать обратный вызов следующим образом:

foo. js

const pass = require('./bar');

pass('https://www.google.com/', test => {
    console.log(`The return is: ${test}`);
}); 

бар. js

const https = require('https');

module.exports = (url, callback) => {
    https
    .get(url, (res) => {
        console.log(res.statusCode)
        if (typeof res.statusCode !== 'undefined' && res.statusCode.toString()[0] === '2') {
            console.log(`Results: ${res.statusCode}`)
            callback(true)
        } else {
            callback(false)
        }
    })
    .on('error', (e) => {
        console.error(`Error ${e}`)
        callback(false)
    })
}
...