我有以下Node.js代码调用天气web服务来获取json repsonse:
var reqGet = https.request(optionsgetmsg, function(res) {
console.log("statusCode: ", res.statusCode);
// uncomment it for header details
// console.log("headers: ", res.headers);
res.on('data', function(d) {
console.info('GET result after POST:\n');
process.stdout.write(d);
console.info('\n\nCall completed');
});
return d;
});
当我使用process.stdout.write(d)
时,输出到终端的是非常JSON格式的文本,如下所示:
{
"response": {
"version":"0.1",
"termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
"features": {
"geolookup": 1
,
"conditions": 1
}
}
, "location": {
"type":"CITY",
"country":"US",
"country_iso3166":"US",
"country_name":"USA",
"state":"IN",
"city":"Indianapolis",
"tz_short":"EDT",
"tz_long":"America/Indianapolis"
}
}
但是当我尝试使用socket.io发出d时,在chrome dev工具中查看对象时会变成一堆数字。
io.sockets.on('connection',function(socketWeather){
socketWeather.emit('weather', { weather: d });
});
Chrome控制台输出(包含8616个随机数的巨大数组):
Object {weather: Array[8616]}
如何才能将漂亮的JSON格式文本正确地推送到我的客户端?
更新:我刚注意到虽然process.stdout.write(d)
给了我很好的JSON,但console.info(d)
和console.log(d)
都在终端打印出来:
<Buffer 0a 7b 0a 20 20 22 72 65 73 70 6f 6e 73 65 22 3a 20
7b 0a 20 20 22 76 65 72 73 69 6f 6e 22 3a 22 30 2e 31 22
2c 0a 20 20 22 74 65 72 6d 73 6f 66 53 65 72 ...>
答案 0 :(得分:2)
您遇到的问题是数据是从流中返回的。 stdout支持流,因此它看起来应该如此。另一方面,console.log在每个实例之后附加一个换行符,因此它在将它传递给stdout之前打破了流,因此缓冲区被直接写入。
而不是记录每个数据,甚至将数据构建到变量中,并在结束事件期间处理输出。
var response = '';
res.on('data', function(d) {
response += data;
});
res.on('end', function(d) {
console.log(response);
// now you can do what you need to with it including passing it to the socket
});
作为替代方案,您可以在浏览器端处理它,方法是将流缓冲区转换为字符串,但我个人仍然希望将该逻辑保留在后端。