如何在 Node JS 中打印对象

Posted

技术标签:

【中文标题】如何在 Node JS 中打印对象【英文标题】:How to print object in 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`);
  );

【问题讨论】:

***.com/questions/4816099/… 你使用body-parser吗? res.country 不应未定义。 @Cristy 我没有使用 body-parser; res.country 打印为未定义。不知道为什么会这样? 【参考方案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,可能它不存在。无论哪种情况,您都没有在问题中分享正确的信息。您应该对您的代码进行适当的研究和测试,并就您遇到的实际问题提出另一个问题。

以上是关于如何在 Node JS 中打印对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swig node js 在变量中设置 JSON 对象?

如何在 node.js 中搜索字符串的流?

Node.js:如何将打印作业添加到打印机

如何在 node.js 中更改终端颜色

如何在Node.js中合并两个复杂对象

如何在Node.js中获取两个表数据,对象在另一个对象中