У меня проблема с этим фрагментом кода:
async getDomains (req, res) {
try {
let domains = await Domain.findAll({ raw: true })
for(domain of domains) {
console.info('1')
var options = {
host: domain.name,
port: 443,
method: 'GET'
};
var request = https.request(options, (res) => {
console.info('2')
console.info('iam here')
domain.ssl = {
'valid_until': res.connection.getPeerCertificate().valid_from
}
});
console.info('3')
request.end();
}
console.info('4')
res.send(domains)
} catch(err) {
res.status(400).send({
error: err
})
}
},
На выходе должно быть 1, 2, 3, 4, но вместо этого я получил 1, 3, 4, 2.
Кто-нибудь знает, как этого добиться?
Вы должны деформировать запрос с обещанием и ждать его. См.: stackoverflow.com/questions/52951091/…
Отвечает ли это на ваш вопрос? как использовать асинхронный ожидание с почтовым запросом https
Если вы не можете await https.request()
, используйте такую библиотеку, как node-fetch
, чтобы вы могли await fetch()
. Спасет вас от головной боли
@Assayag Я сделал это, но он застрял внутри запроса, и все после этого не будет выполнено.
@JeremyThille Спасибо за совет, я попробую! но сначала я хочу узнать, как это сделать без использования библиотеки.
Вы предоставили обратный вызов request
, поэтому он отправит запрос и продолжит работу, регистрируя 2
только после получения ответа. Вы можете использовать что-то вроде Promise
или async
/await
, чтобы дождаться ответа на ваш запрос.
var request = await (new Promise((resolve, reject) => {
https.request(options, (res) => {
console.info('2');
console.info('i am here');
domain.ssl = { /* stuff */ };
resolve();
});
));
это правильно, но нет необходимости заключать new Promise
в круглые скобки, так как вы ничего не привязываете к созданному объекту Promise.
Большое спасибо! Теперь у меня есть другая проблема: похоже, что он не выходит из запроса и не печатает, например, «3» или «4», у вас есть идея, как это сделать? Я думаю, что он застрял внутри запроса.
и через несколько минут я получил «Ошибка: зависание сокета»
@Delaey, вы могли бы добавить обратные вызовы ошибок для req
javascript req.on('error', (err) => { console.info(err); });
@ ginga_ninja217 Я решил это, заменив «запрос» на «получить», и это сработало как шарм, большое спасибо за помощь!
это связано с тем, что к тому времени, когда https.request обработает запрос, синтаксический анализатор уже выполнил журналы 3 и 4.