Есть asyn c и await, которые, казалось бы, случайным образом разбросаны по всей вашей функции. Вы должны понимать, что единственное, что здесь асинхронно, - это whois.lookup()
. console.log не является асинхронным. Array.prototype.split не является асинхронным. Обратный вызов (err, data) => {...}
не является асинхронным.
Если вы хотите использовать шаблон обратного вызова, тогда вам нужно использовать res.send()
внутри обратного вызова
(err, data) => {
res.send(data)
}
Но мы устали с шаблонами обратного вызова из-за того, насколько беспорядочно их вкладывать. Поэтому вместо этого мы перешли к использованию обещаний. Если у вас есть обратные вызовы, но вы хотите использовать обещания, вы заключаете обратный вызов в обещание. Вы делаете это один раз, и вы делаете это как можно ближе к вызывающему ошибку обратному вызову:
function promisifiedLookup(url){
return new Promise( (resolve, reject) => {
whois.lookup(url, function(err, data) {
if(err) reject(err)
else resolve(data)
})
})
}
Итак, чтобы использовать async / await, нам нужно следующее:
- вызывающий функция объявлена asyn c
- вызываемая функция возвращает обещание (иначе ждать нечего)
async function whoisFunction() {
let data = await promisifiedLookup(url) // _NOW_ we can use await
data = data.split('\n')
// ...
return data; // Because this funtion is declared async, it will automatically return promise.
}
Если ваш express -handler определяется как asyn c, то теперь вы также можете использовать здесь await:
res.status(200).json(await whoisFunction())