Javascript 如何在Node JS中打印对象
在下面的代码(在Node JS上运行)中,我试图使用Javascript 如何在Node JS中打印对象,javascript,json,node.js,Javascript,Json,Node.js,在下面的代码(在Node JS上运行)中,我试图使用JSON.stringify打印从外部API获得的对象,这会导致错误: TypeError:将循环结构转换为JSON 我已经看了关于这个话题的问题,但没有一个能帮上忙。请有人建议: a) 如何从res对象获取country值 b) 如何打印整个对象本身 http.get('http://ip-api.com/json', (res) => { console.log(`Got response: ${res.stat
JSON.stringify
打印从外部API获得的对象,这会导致错误:
TypeError:将循环结构转换为JSON
我已经看了关于这个话题的问题,但没有一个能帮上忙。请有人建议:
a) 如何从res
对象获取country
值
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}`);
});
打印整个对象时,递归引用不会出现问题:
console.log(res);
> var q = {a:0, b:0}
> q.b = q
> console.log(q)
{ a: 0, b: [Circular] }
以下是console.log如何处理循环引用的示例:
console.log(res);
> var q = {a:0, b:0}
> q.b = q
> console.log(q)
{ a: 0, b: [Circular] }
另外,我建议您检查您实际接收的数据。基本
控制台。日志将不会经过长而复杂的对象,可能会决定只打印[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
。无需要求
它,但它将打破循环引用,而不是打印存在引用的事实。通过使用http请求
客户端,我可以打印JSON对象以及国家
值。下面是我的更新代码
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
}
});
实际上,您并没有在res
中获取数据。您需要('data')
上的,('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);
});
});
Noe从
解析的
这是一个json对象,您可以获得任何属性您可以向console.log()传递两个参数
在安装“yargs”后尝试此代码,它将打印整个对象
log('object is',yargs.argv)
我认为它可能会帮助您打印整个对象:)这可以以最简单的方式打印对象的键和对象的值。试试看
const jsonObj = {
a: 'somestring',
b: 42,
c: false
};
Array.from(Object.keys(jsonObj)).forEach(function(key){
console.log(key + ":" + jsonObj[key]);
});
你使用身体分析器吗
res.country
不应该是未定义的。@Cristy我没有使用body解析器;res.country打印为未定义。不确定它为什么会这样做?console.log(res)打印我们非常长的数据,其中包含关于“scoket”、“ReadableState”、“writeablestate”、“ClientRequest”、“Connection”等的配置信息。。它不包含我正在寻找的JSON响应。它包含整个HTTP响应
对象,如Express文档中所示。您应该尝试打印res.body
,或筛选整个对象。@DrakaSAN打印'res.body'会导致->未定义;我在整个对象中搜索了钥匙(国家、地区),但都不存在。@kurrodu我不确定你对我有什么期望。你甚至没有提到你使用什么HTTP库来获取数据,我怎么知道你在哪里可以找到它呢。事实上,console.log(res)打印了很长的数据,
并没有真正向我解释这个问题。只需将数据复制到文本编辑器,然后找到所需的内容。或者阅读HTTP库的文档。@kurrodu您问了一个问题“如何在节点JS中打印对象”。不是“我无法让我的JSON请求工作”。我告诉过你检查服务器发送的数据。是你干的吗?如果在响应中看不到JSON,可能它不在那里。无论哪种情况,您都没有在问题中共享适当的信息。你应该对你的代码进行适当的研究和测试,然后问另一个关于你实际问题的问题。它打印整个对象而不是JSON响应数据。@ KurrdU可能数据不在那里,你考虑过这种可能性吗?