4

当我尝试从下面运行代码时:

var express = require('express');
var app = express();
var port = process.env.PORT || 5000;

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



app.listen(port, function() {
    console.log("Listening on " + port);
    makeRequest();
});



function makeRequest(){

    var url = 'https://api.stackexchange.com/2.1/search?pagesize=5&order=desc&sort=activity&intitle=ios development&site=stackoverflow';
    var headers = {'Accept-Encoding': 'gzip'};

    var response = request(url, headers);

    gunzipJSON(response);
}

function gunzipJSON(response){

    var gunzip = zlib.createGunzip();
    var json = "";

    gunzip.on('data', function(data){
        json += data.toString();
    });

    gunzip.on('end', function(){
        parseJSON(json);
    });

    response.pipe(gunzip);
}

function parseJSON(json){

    var json = JSON.parse(json);

    if(json.items.length){

        for(var i in json.items){

            console.log(json.items[i].title + '\n' + json.items[i].link);

        }

    }
}

我收到错误消息

错误:Zlib._binding.onerror (zlib.js:286:17) 中的标头检查不正确

我在代码中传递了我自己的压缩 url。

任何帮助都会非常有用。

谢谢

4

1 回答 1

0

老问题(现在不推荐使用request库),但迟到总比没有好:

有趣的是,有问题的代码在 Node.js 版本 15.13.0 上对我有用,但在 14.16.0 上却不行(保持版本request相同,即最新的 2.88.2)。

但是,仅使用以下简单代码可在 14.16.0(现场演示)上使用,但不适用于 15.13.0!:

request(url, function (error, response, body) {
  console.log(JSON.parse(body)); 
});

这意味着由于某种原因,在 14.16.0 上,响应正文会自动解压缩(因此上面的代码片段有效),而在 15.13.0 上,响应正文保持压缩状态,因此需要主动解压缩。

于 2021-09-20T12:58:12.333 回答