无法在 express JS 中通过 res.json 打印对象

Cannot print object through res.json in express JS

我正在尝试构建一个 API,通过它我可以在 JSON 输出中获取 whois 详细信息,如下所示

为此,我从 npm (https://www.npmjs.com/package/whois[whois Link]2) 安装了 whois 包。我尝试将字符串转换为对象并以 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())

async 和 await 看似随机地散布在您的整个函数中。 您应该意识到这里唯一异步的是whois.lookup()。 console.log 不是异步的。 Array.prototype.split 不是异步的。回调 (err, data) => {...} 不是异步的。

如果你想使用回调模式,那么你需要在回调中使用res.send()

(err, data) => {
  res.send(data)
}

但是我们厌倦了 callback-patterns 因为嵌套它们是多么的混乱。所以我们转而使用 promises。如果您有回调但想使用 promise,那么您可以将回调包装在 promise 中。你只做一次,并且尽可能紧贴有问题的回调:

  function promisifiedLookup(url){
    return new Promise( (resolve, reject) => {
      whois.lookup(url, function(err, data) {
        if(err) reject(err)
        else resolve(data)
      })
    })
  }

因此,要使用 async/await,我们需要:

  1. 调用函数被声明为异步
  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 定义为异步,那么您现在也可以在这里使用 await:

res.status(200).json(await whoisFunction())