Когда я разрабатываю модуль для вызова 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}
?