javascript - 如何强制 Node 的请求模块不对响应进行编码?

标签 javascript node.js

我正在使用 Node 的 request 模块。
我得到的响应是“gziped”或以其他方式编码的。

我该怎么办
1. 构建请求不对响应进行编码?
2. 解码响应?
数据来自http://api.stackexchange.com .

var myRequest = require('request');
var zlib = require('zlib');

var stackRequest = require('request'); 
var apikey = '<MyKey>';
var fromdate = '1359417601';
var tagged = 'node.js';
stackRequest(
    { method: 'GET'
        , uri: 'http://api.stackexchange.com/2.1/questions?key=' + apikey + 
          '&site=stackoverflow&fromdate=' + fromdate + '&order=desc&' + 
          'sort=activity&tagged=' + tagged + '&filter=default'
}, function(err, response, body) { 
    console.log(response.body); // How can I decode this?
}); 

最佳答案

编码与request无关。 StackOverflow 的 API 始终返回 GZip 编码数据,如 the API documentation 中所述。 。您需要使用 Node 的 zlib模块来解压缩内容。这是一个简单的例子:

var zlib = require('zlib');

// Other code

, function(err, response, body) {
   zlip.gunzip(body, function(err, data){
     console.log(data);
  });
});

这样做的主要缺点(很糟糕)是这会强制 request模块将整个响应内容处理为一个 Bufferbody 。相反,您通常应该使用 Node 的 Stream系统直接通过解压库发送来自请求的数据,这样就可以使用更少的内存。您仍然需要将这些部分连接在一起来解析 JSON,但它仍然更好。

var zlib = require('zlib');
var request = require('request');

var apikey = '<MyKey>';
var fromdate = '1359417601';
var tagged = 'node.js';
var compressedStream = request('http://api.stackexchange.com/2.1/questions?' +
    'key=' + apikey + '&site=stackoverflow&fromdate=' + fromdate +
    '&order=desc&sort=activity&tagged=' + tagged + '&filter=default');

var decompressedStream = compressedStream.pipe(zlib.createGunzip());

var chunks = [];
decompressedStream.on('data', function(chunk){
  chunks.push(chunk);
});
decompressedStream.on('end', function(){
    var body = Buffer.concat(chunks);

    var data = JSON.parse(body);

    // Do your thing
});

关于javascript - 如何强制 Node 的请求模块不对响应进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14597125/

相关文章:

javascript - setTimeout 与揭示模块模式

javascript - 如何从另一个页面打开我的切换 Accordion ?

javascript - 如何使用 jquery 检测选项取消选择?

javascript - AJAX GET 调用将在第一次调用时起作用,但在其他点击后不起作用

javascript - 如何一一执行url请求而不导致堆栈溢出? ( Node .JS)

node.js - 使用 socket.io 和 sails.js 发送 session 特定消息

javascript - 如何在 jquery 中使用 $(this) 获取元素的第一个子元素?

node.js - Node : Unable to mock aws-sdk methods

javascript - vars 存储在 Nodejs 中的什么位置?

node.js - Sequelize 将所有表字段更改为蛇形大小写