在下面的代码中(在Node JS上运行)我试图使用JSON.stringify
打印从外部API获取的对象,这会导致错误:
TypeError:将循环结构转换为JSON
我已经查看了有关此主题的问题,但没有人可以提供帮助。有人可以建议:
a)如何从country
对象中获取res
值?
b)我如何打印整个对象本身?
http.get('http://ip-api.com/json', (res) => {
console.log(`Got response: ${res.statusCode}`);
console.log(res.country) // *** Results in Undefined
console.log(JSON.stringify(res)); // *** Resulting in a TypeError: Converting circular structure to JSON
res.resume();
}).on('error', (e) => {
console.log(`Got error: ${e.message}`);
});
答案 0 :(得分:13)
基本console.log
不会通过冗长而复杂的对象,而是可能决定只打印[Object]
。
在node.js中阻止它的一个好方法是使用util.inspect
:
'use strict';
const util = require('util'),
obj = /*Long and complex object*/;
console.log(util.inspect(obj, {depth: null}));
//depth: null tell util.inspect to open everything until it get to a circular reference, the result can be quite long however.
编辑:在收缩中(例如在REPL中),第二个选项是JSON.stringify
。不需要require
它,但它会打破循环引用而不是打印存在引用的事实。
答案 1 :(得分:3)
通过使用http request
客户端,我可以打印JSON对象以及打印country
值。以下是我更新的代码。
var request = require('request');
request('http://ip-api.com/json', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(response.body); // Prints the JSON object
var object = JSON.parse(body);
console.log(object['country']) // Prints the country value from the JSON object
}
});
答案 2 :(得分:2)
打印整个对象,它不会出现递归引用的问题:
console.log(res);
以下是一个示例,供您查看console.log如何处理循环引用:
> var q = {a:0, b:0}
> q.b = q
> console.log(q)
{ a: 0, b: [Circular] }
另外,我建议您检查一下您实际接收的数据。
答案 3 :(得分:0)
您实际上并未在res
中获取数据。您需要on('data')
和on.('end')
body
是一个字符串。它会附加到收到的数据上,因此在完成后您需要将数据解析为json
http.get("http://ip-api.com/json", function(res) {
var body = '';
res.on('data', function(data){
body = body + data;
});
res.on('end', function() {
var parsed = {};
try{
parsed = JSON.parse(body); // i have checked its working correctly
}
catch(er){
//do nothing it is already json
}
console.log(parsed.country);
});
});
来自parsed
的Noe是一个json对象,你可以获得任何属性
答案 4 :(得分:0)
您可以将两个参数传递给console.log()
安装“yargs”后尝试此代码并打印整个对象
console.log('object is',yargs.argv);
我想可能会帮助你打印整个对象:)
答案 5 :(得分:0)
这可以以最简单的方式打印对象的键和对象的值。试试吧。
const jsonObj = {
a: 'somestring',
b: 42,
c: false
};
Array.from(Object.keys(jsonObj)).forEach(function(key){
console.log(key + ":" + jsonObj[key]);
});
答案 6 :(得分:0)
在 2021 年,我只是使用打印
app.post("/",(req,res) => {
console.log("HI "+JSON.stringify(req.body));
res.send("Hi")
});
并得到我的输出为 HI {"Hi":"Hi"}
。
我发送了
{
"Hi": "Hi"
}
作为我的帖子请求正文。
只在控制台上执行 console.log(req.body)
打印 [object Object]
,但现在可以了。