如何在 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 中打印对象的主要内容,如果未能解决你的问题,请参考以下文章