Nodejs,表达http请求 - 响应不解压缩

Nodejs, express http request - response not unzipping

我正在尝试编写一个创建 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();
    });
}

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

很明显,JSONparsing 失败了。我错过了什么?

感谢大家的帮助

https.request() 本身不支持 gzip 压缩。因此,您必须自己添加对它的支持,如图所示 here or use an https request library such as got() 已经支持 gzip(并且也已经支持 promises)。

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 解析的结果。

如果您希望得到 gzipped JSON 响应,那么您可以使用:

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

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

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