我正在做一些基本的JSON解析,并想知道为什么节点js在与字符串一起记录时折叠对象
所以例如在下面的代码中,如果我去console.log(processedData)
它不会折叠对象并显示整个字符串但是如果我去console.log('Body: ' + processedData)
它会折叠对象然后去[对象]对象] [对象] ....我知道如何使用util
再次扩展它们,但我很好奇它背后的逻辑,因为我对节点很新。我想我可能会错过任何事情。
const http = require('http');
const util = require('util');
var options = {
host: 'http://nodejs.org/dist/index.json'
// host: 'en.wikipedia.org',
// path: '/w/api.php?action=query&list=allpages&apfrom=Imperial&aplimit=500&format=json'
};
var req = http.get('http://nodejs.org/dist/index.json', function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
let body = '';
res.on('data', function(chunk) {
body += chunk;
}).on('end', function() {
let processedData = JSON.parse(body);
console.log('Body : ' + processedData);
console.log(typeof body);
})
});
req.on('error', function(e) {
console.log('ERROR: ' + e.message);
});
答案 0 :(得分:3)
致电时
console.log(processedData)
您将整个对象传递给console.log
,以便它可以做到这一点。但是,当你打电话
console.log('Body: ' + processedData)
您将'Body: ' + processedData
的结果传递给console.log
。对此表达式的求值会导致processedData
转换为其字符串表示形式,如果您未在对象上定义toString
,则只需[object Object]
,因此您会看到{{1}被记录。
实现目标的最简单方法是简单地将它们作为单独的参数传递:
Body: [object Object]
答案 1 :(得分:1)
也许我们应该回答以下问题:"如果您按照以下方式进行操作 - 预期会出现什么样的结果?"
var myVar = "Body : " + processData;
当js引擎尝试评估这样的表达式时,它知道表达式的第一个参数是' string',因此它尝试将字符串与另一个字符串连接起来。 processData如何成为字符串?通过调用' toString()'在processData上。
为了达到您期望的结果,尝试以这种方式使用console.log:
console.log("Body:", processData);
答案 2 :(得分:0)
这是因为JS类型强制。
在第一种情况下,您将其打印为对象,但在第二种情况下,将其添加到字符串('Body: ' + processedData
) - 并根据JS类型强制规则将其转换为字符串(它将其连接到字符串)
您可以按照建议使用util模块,也可以使用console.dir({body:processedData},{colors:true,depth:4});