2016-08-04 94 views
-1

在下面的代码(在节点JS运行),我尝试打印使用JSON.stringify这导致错误外部API获得的对象:如何打印对象节点JS

TypeError: Converting circular structure to 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}`); 
    }); 
+1

http://stackoverflow.com/ question/4816099/chrome-sendrequest-error-typeerror-conversion-circular-structure-to-json – Cristy

+1

你使用body-parser吗? 'res.country'不应该是未定义的。 – Cristy

+0

@Cristy我没有使用body-parser; res.country打印为未定义。不知道它为什么这样做? – kurrodu

回答

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

打印整个对象,它不会有递归的参考文献的问题:

console.log(res); 

下面是一个例子给你看的console.log如何处理圆参考文献的:

> var q = {a:0, b:0} 
> q.b = q 
> console.log(q) 
{ a: 0, b: [Circular] } 

另外,我会建议检查您实际收到的数据。

+0

console.log(res)打印我们非常长的数据,包含'scoket','ReadableState','WritableState','ClientRequest','Connection'等配置信息。它不包含我在寻找的JSON响应对于。 – kurrodu

+0

它包含整个HTTP响应对象,如Express文档中所示。你应该尝试打印'res.body',或筛选整个对象。 – DrakaSAN

+0

@DrakaSAN打印'res.body'结果 - > undefined;我搜索了整个对象的键(国家,地区),但没有一个存在。 – kurrodu

6

基本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. 
+0

它打印整个对象而不是JSON响应数据。 – kurrodu

+1

@ kurrodu可能数据不存在然后,你认为这种可能性? –

0

您实际上没有在res中获取数据。您需要on('data')on.('end')

body是一个字符串。它得到追加的数据接收,所以在完成后,您需要将数据从parsed这是一个JSON对象解析成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); 
    }); 
}); 

野老,您可以得到任何财产