Javascript 如何在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

在下面的代码(在Node JS上运行)中,我试图使用
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可能数据不在那里,你考虑过这种可能性吗?