Невозможно распечатать объект через разрешение json в express JS - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь создать API, с помощью которого я могу получить подробную информацию о whois в выводе JSON, как показано ниже

enter image description here

For this, I installed the whois package from npm (https://www.npmjs.com/package/whois [whois Link] 2 ). Я попытался преобразовать строку в объект и распечатать ее в формате JSON, но я не получаю никакого вывода в Интернете, но это консоль, я могу легко получить данные. Ребята, пожалуйста, исправьте мою ошибку.

function whoisFunction() {
    var whois = require('whois')
    whois.lookup(url,async function(err, data) {
      try {
        a = await data.split('\n')

      }
      catch (e) {
        console.log(e)
        return e
      }

      c=[]
      for(i = 0; i < a.length; i++){
        c.push(a[i])
      }
      await console.log(typeof (c))
      console.log(c)
      return a
    })
  }
// res.json({'Headers':+whoisFunction()})
  res.status(200).json(whoisFunction())

1 Ответ

1 голос
/ 03 августа 2020

Есть 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, нам нужно следующее:

  1. вызывающий функция объявлена ​​asyn c
  2. вызываемая функция возвращает обещание (иначе ждать нечего)
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())
...