无法在 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,我们需要:
- 调用函数被声明为异步
- 被调用的函数正在返回一个承诺(否则没有什么可等待的)
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())
我正在尝试构建一个 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,我们需要:
- 调用函数被声明为异步
- 被调用的函数正在返回一个承诺(否则没有什么可等待的)
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())