【问题标题】:How to print object in Node JS如何在 Node JS 中打印对象
【发布时间】:2016-12-10 15:35:00
【问题描述】:

在下面的代码中(在 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}`);
  });

【问题讨论】:

  • 你使用body-parser吗? res.country 不应未定义。
  • @Cristy 我没有使用 body-parser; res.country 打印为未定义。不知道为什么会这样?

标签: javascript json node.js


【解决方案1】:

在 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] 但现在可以了。

【讨论】:

    【解决方案2】:

    这样可以用最简单的方式打印对象的键和对象的值。试试看吧。

    const jsonObj = {
      a: 'somestring',
      b: 42,
      c: false
    };
    
    Array.from(Object.keys(jsonObj)).forEach(function(key){
      console.log(key + ":" + jsonObj[key]);
    });
    

    【讨论】:

      【解决方案3】:

      基本的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 它,但它会在循环引用上中断,而不是打印有引用的事实。

      【讨论】:

      • 打印整个对象,但不打印 JSON 响应数据。
      • @kurrodu 可能当时数据不存在,你考虑过这种可能性吗?
      【解决方案4】:

      您可以将两个参数传递给 console.log()

      安装“yargs”后试试这段代码,它会打印整个对象

      console.log('对象是' , yargs.argv);

      我认为它可能会帮助您打印整个对象:)

      【讨论】:

        【解决方案5】:

        您实际上并没有在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对象,你可以获取任何属性

        【讨论】:

          【解决方案6】:

          通过使用 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
            }
          });
          

          【讨论】:

            【解决方案7】:

            打印整个对象,递归引用不会有问题:

            console.log(res);
            

            这里有一个例子让你看看console.log如何处理循环引用:

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

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

            【讨论】:

            • console.log(res) 打印我们很长的数据,其中包含关于“scoket”、“ReadableState”、“WritableState”、“ClientRequest”、“Connection”等的配置信息。它没有包含我正在寻找的 JSON 响应。
            • 它包含整个 HTTP response 对象,如 Express 文档中所示。您应该尝试打印res.body,或筛选整个对象。
            • @DrakaSAN 打印“res.body”导致 -> 未定义;我在整个对象中搜索了键(国家、地区),但它们都不存在。
            • @kurrodu 我不确定你对我有什么期望。你甚至没有提到你使用什么 HTTP 库来获取这些数据,我怎么知道你在哪里可以找到它。 console.log(res) prints our very long data, 并没有真正向我解释这个问题。只需将数据复制到文本编辑器并找到您需要的内容。或者阅读您的 HTTP 库的文档。
            • @kurrodu 您问了“如何在 Node JS 中打印对象”的问题。不是“我无法让我的 JSON 请求工作”。我告诉你检查服务器发送的数据是什么。是你做的吗?如果您在响应中看不到 JSON,可能它不存在。无论哪种情况,您都没有在问题中分享正确的信息。您应该对您的代码进行适当的研究和测试,并就您遇到的实际问题提出另一个问题。
            猜你喜欢
            • 1970-01-01
            • 2020-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多