【问题标题】:Nodejs, express http request - response not unzippingNodejs,表达http请求 - 响应未解压缩
【发布时间】:2022-01-31 04:26:49
【问题描述】:

我正在尝试编写一个创建 HTTPS 请求的函数。

这都是使用 Typescript 的 expressjs 项目的一部分。

我可以让 HTTPS 请求正常工作并获得响应 - 但响应是使用 GZIP 编码的。我正在尽力遵循文档。但不走运,响应保持压缩状态。

这是我的代码

private getData = (host, pathname): Promise<string> => {
    return new Promise((resolve, reject) => {
        const options = {
            hostname: host,
            path: pathname,
            gzip: true,
            method: 'GET',
            headers: {'x-apikey': 'XXXX'}
        }
        const req = https.request(options, (res) => {
            if (res.statusCode < 200 || res.statusCode >= 300) {
                console.log('error!')
                return reject(new Error('statusCode=' + res.statusCode));
            }
            let body = '';
            res.on('data', function (chunk) {
                body += chunk;
            });
            res.on('end', function () {
                try {
                    console.log('res.headers', res.headers)
                    console.log('res.headers', body)

                    body = JSON.parse.toString();

                    resolve(body);
                } catch (e) {
                    reject(e);
                }
                resolve(body);
            });
            req.on('error', (e) => {
                reject(e.message);
            });
            // send the request

        });
        req.end();
    });
}

控制台日志语句显示了这一点

很明显,JSON 解析失败了。我错过了什么?

感谢大家的帮助

【问题讨论】:

    标签: node.js https


    【解决方案1】:

    https.request() 本身不支持 gzip 压缩。因此,您必须自己添加对它的支持,如 here 所示,或者使用已经支持 gzip(并且也已经支持 Promise)的 https 请求库,例如 got()

    import got from 'got';
    
    private getData = (host, pathname): Promise<string> => {
        const options = {
            method: 'GET',
            headers: {'x-apikey': 'XXXX'}
        }
        return got(`https://${host}${pathname}`, options).json();
    }
    

    仅供参考,在您的问题中不清楚您期望得到什么类型的回复。您尝试使用:

    body = JSON.parse.toString();
    

    这没有任何意义,因为JSON.parse.toString() 正在尝试获取JSON.parse 函数的字符串版本,而实际上甚至没有调用该函数 - 非常奇怪。也许你的意思是JSON.parse(body)?但是,您的打字稿使您看起来像是在期待一个解析为字符串的承诺,因此这通常不是 JSON 解析的结果。

    如果您期望的是压缩后的 JSON 响应,那么您可以使用:

    return got(`https://${host}${pathname}`, options).json();
    

    我在上面显示。如果您只期望一个字符串,而不是 JSON,那么您可以将该行更改为:

    return got(`https://${host}${pathname}`, options).text();
    

    【讨论】:

    • 感谢大家的帮助,马上试试!
    • 上述解决方案有效,但最后我选择编写自己的解决方案。答案帮助我理解了问题。
    猜你喜欢
    • 2012-08-22
    • 2012-02-12
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多