Nodejs request 模块问题

Nodejs request 模块问题

这个是 request模块地址 https://github.com/mikeal/request

这个库我无法获取 gzip 的数据

有方法解决没

我尝试了 http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression 这个里面的方法,但是我没有解决了

求各位朋友给个解决方法


4 回复

Nodejs request 模块问题

你提到的 request 模块已经不再维护,并且不支持一些现代的功能,比如自动处理 gzip 压缩。建议你可以使用更现代的 HTTP 客户端库,如 axiosnode-fetch

不过,如果你仍然想使用 request 模块并且需要处理 gzip 压缩的数据,可以参考以下示例代码:

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

// 发送请求并处理响应
request({
    url: 'http://example.com', // 你的目标 URL
    encoding: null,            // 设置为 null 来接收原始的 Buffer 数据
    gzip: true                 // 启用 gzip 压缩
}, (err, res, body) => {
    if (err) {
        console.error(err);
        return;
    }

    // 检查响应头以确认是否为 gzip 压缩
    if (res.headers['content-encoding'] === 'gzip') {
        // 使用 zlib 模块解压数据
        zlib.gunzip(body, (err, decodedData) => {
            if (err) {
                console.error('Error decompressing data:', err);
                return;
            }
            console.log('Decompressed Data:', decodedData.toString());
        });
    } else {
        // 如果没有压缩,直接输出原始数据
        console.log('Raw Data:', body.toString());
    }
});

解释

  1. encoding: null: 这个选项告诉 request 不要尝试将响应体转换成字符串,而是返回一个 Buffer 对象。
  2. gzip: true: 启用 gzip 压缩支持。
  3. 检查响应头: 在回调函数中,我们首先检查响应头中的 content-encoding 字段来确认数据是否被 gzip 压缩。
  4. 解压数据: 如果数据被压缩,我们使用 zlib.gunzip() 方法来解压数据。
  5. 输出数据: 最后,我们将解压后的数据打印出来。

注意事项

  • request 模块已停止维护,建议转用其他库如 axiosnode-fetch
  • 使用 axiosnode-fetch 可以更方便地处理 gzip 压缩的数据,因为这些库通常会自动处理压缩。

希望这能帮助你解决问题!


虽然你说已经尝试了上面的方法,但是无法确定你 正确地照做了 ,因此最好

  • 贴出你的代码
  • 给出你用来测试的返回了 gzip 内容的网址

这样可以方便大家测试。

request 处理gzip 超级蛋疼…

我把源码看了一遍,才搞懂是怎么一回事

去看这个我提并且我处理的的issue 吧…

https://github.com/mikeal/request/issues/747

使用 request 模块请求包含 gzip 压缩的数据时,默认情况下 request 模块会自动处理 gzip 和 deflate 压缩。如果发现没有正确解压缩数据,可能是因为某些配置或依赖项的问题。

为了确保 request 模块能够正确处理 gzip 压缩的数据,你可以按照以下方式来设置请求参数:

const request = require('request');

const options = {
    url: 'http://example.com', // 请替换为你的目标URL
    encoding: null, // 确保 response 是 Buffer 类型,而不是字符串
    gzip: true, // 启用 gzip 压缩支持
};

request(options, (err, res, body) => {
    if (err) {
        console.error(err);
        return;
    }

    if (res.statusCode !== 200) {
        console.error(`请求失败,状态码: ${res.statusCode}`);
        return;
    }

    // 如果你希望将响应体转换为字符串(例如,当它是 JSON 数据时)
    const decodedBody = body.toString('utf-8');
    
    console.log(decodedBody);
});

在这段代码中,encoding: null 设置是为了确保响应体不会被自动解码为字符串,而是保持为 Buffer 类型,这样 request 模块可以更方便地处理压缩的数据。gzip: true 参数则告诉 request 模块启用 gzip 压缩的支持。

如果你仍然遇到问题,建议检查目标服务器是否正确设置了 Content-Encoding: gzip 头,并且确保你的 Node.js 环境和依赖项是最新的。

回到顶部