如何修改Axios流的分块大小?
如何修改Axios流的分块大小?
嘿,你的当前代码能正常工作很棒!不过要直接让Axios调整流的分块大小,其实Axios本身并没有提供现成的配置项——因为这个分块大小本质上是由Node.js底层的HTTP模块(Axios在Node环境下默认用它)或者服务器端发送的响应分块来决定的。不过别担心,我们有两种靠谱的方法来实现你想要的效果:
方法一:通过自定义Transform流重新分块
既然Axios返回的data是标准的Node.js Readable流,我们可以自己写一个Transform流,把原流的块重新拆分成你指定大小的块,再pipe到目标流。这种方法灵活度高,不需要改动Axios的核心配置:
const { Transform } = require('stream'); // 创建自定义分块的Transform流,这里设置分块大小为1KB(1024字节) const chunker = new Transform({ readableObjectMode: false, writableObjectMode: false, transform(chunk, encoding, callback) { const targetChunkSize = 1024; // 你可以修改这个值来调整分块大小 let offset = 0; while (offset < chunk.length) { this.push(chunk.slice(offset, offset + targetChunkSize)); offset += targetChunkSize; } callback(); } }); // 修改你的请求代码,把原流先经过chunker再导向目标流 const { status, headers, data } = await axios(config); data.pipe(chunker).pipe(streamTarget);
方法二:修改Axios底层HTTP请求的highWaterMark
如果希望从底层请求接收环节就控制块大小,可以通过自定义Axios的adapter来修改HTTP请求的highWaterMark参数(这个参数控制Node.js HTTP模块接收数据的缓冲区大小):
const axios = require('axios'); const http = require('http'); const https = require('https'); // 自定义adapter,调整请求的highWaterMark const customAdapter = (config) => { const agent = config.url.startsWith('https') ? https : http; return new Promise((resolve, reject) => { const req = agent.request({ ...config, highWaterMark: 2048, // 设置你想要的缓冲区大小,单位字节 }, (res) => { // 包装成Axios要求的响应格式 const response = { status: res.statusCode, statusText: res.statusMessage, headers: res.headers, config: config, request: req, data: res }; resolve(response); }); req.on('error', reject); req.end(); }); }; // 创建使用自定义adapter的Axios实例 const axiosInstance = axios.create({ adapter: customAdapter }); // 用这个实例发起请求 const { status, headers, data } = await axiosInstance(config); data.pipe(streamTarget);
注意:第二种方法的效果可能受服务器端发送的分块大小限制,如果服务器强制用特定大小发送数据,这个设置可能不会完全生效,但大多数场景下能满足需求。
备注:内容来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

