Почему в моем модуле не работают опции HTTPS? - PullRequest
0 голосов
/ 03 апреля 2020

Когда я разрабатываю модуль для вызова API с HTTPS, я могу заставить работать код, если переданные options жестко установлены.

Модуль с опциями:

module.exports = (host) => {
  const options = {
    host,
    method: 'GET',
    port: 443,
    path: `/api/latest?access_key=${process.env.TOKEN}`,
  }
  return new Promise((resolve, reject) => {
    try {
      https
        .get(options, (res) => {
          console.log(res.statusCode)
          if (typeof res.statusCode !== 'undefined' && res.statusCode.toString()[0] === '2') {
            res.on('data', (chunk) => {
              console.log(chunk.toString('utf8'))
            })
            resolve(false)
          } else {
            resolve(false)
          }
        })
        .on('error', (err) => {
          console.error(err)
          resolve(Error(err))
        })
    } catch (err) {
      reject(Error(err))
    }
  })
}

Когда я удаляю опции, я могу получить ответ:

модуль без опций:

const testedURL = `https://foobar.com/api/latest?access_key=api-token`

module.exports = () => {
  return new Promise((testedURL, reject) => {
    try {
      https
        .get(options, (res) => {
          console.log(res.statusCode)
          if (typeof res.statusCode !== 'undefined' && res.statusCode.toString()[0] === '2') {
            res.on('data', (chunk) => {
              console.log(chunk.toString('utf8'))
            })
            resolve(false)
          } else {
            resolve(false)
          }
        })
        .on('error', (err) => {
          console.error(err)
          resolve(Error(err))
        })
    } catch (err) {
      reject(Error(err))
    }
  })
}

и это работает:

module.exports = (host) => {
  const options = {
    host,
    method: 'GET',
    port: 443,
    path: `/api/latest?access_key=${process.env.TOKEN}`,
  }
  return new Promise((resolve, reject) => {
    try {
      https
        .get(`${options.host}${options.path}`, (res) => {
          console.log(res.statusCode)
          if (typeof res.statusCode !== 'undefined' && res.statusCode.toString()[0] === '2') {
            res.on('data', (chunk) => {
              console.log(chunk.toString('utf8'))
            })
            resolve(false)
          } else {
            resolve(false)
          }
        })
        .on('error', (err) => {
          console.error(err)
          resolve(Error(err))
        })
    } catch (err) {
      reject(Error(err))
    }
  })
}

думая, что это было так, как я написал get в HTTPS, я переписал его, чтобы скопировать документацию:

module.exports = (host) => {
  const options = {
    host,
    method: 'GET',
    port: 443,
    path: `/api/latest?access_key=${process.env.TOKEN}`,
  }

  // console.log(options)
  return new Promise((resolve, reject) => {
    // I can copy this from the terminal and get the API response in the browser:
    // console.log(`${options.host}${options.path}`) 

    try {
      const req = https.request(options, (res) => {
        if (typeof res.statusCode !== 'undefined' && res.statusCode.toString()[0] === '2') {
          res.on('data', (chunk) => {
            const textChunk = chunk.toString('utf8')
            console.log(textChunk)
          })
          resolve(Error('Status code not correct'))
        }
      })
      req.on('error', (e) => {
        console.error(e)
        reject(Error(e))
      })
    } catch (e) {
      reject(Error(e))
    }
}

, но я получаю тот же ответ об ошибке:

{
 Error: connect ECONNREFUSED X.X.X.X:443
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14)
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: 'X.X.X.X',
  port: 443 
}

В моем исследовании кажется, что я строю его правильно:

Я могу проверить соответствие моих параметров жестко закодированному URL. Что я делаю неправильно в моем options, который мешает ему работать, но он работает, когда я передаю его как ${options.host}${options.path}?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...