Node.js使用Axios读取S3 URL后无法生成可读格式Excel文件求助
代码问题分析与修复方案
核心问题点
- responseType 选型错误:Node.js 环境中不存在浏览器专属的
Blob对象,设置responseType: 'blob'会让 Axios 在 Node.js 下生成不兼容的响应数据对象,写入文件后必然导致 Excel 损坏。应改用arraybuffer或stream类型。 - 未正确完成文件写入:仅调用
ostream.write(response.data)后没有关闭流,部分数据可能还在缓冲区未写入磁盘,导致文件不完整,Excel 无法识别。 - 手动写入流的可靠性不足:直接调用
write不如使用流的pipe方法稳定,pipe会自动处理背压、流结束和错误事件,避免数据丢失。
修复后的代码示例
方案一:使用 arraybuffer 类型(适合小文件)
const axios = require('axios'); const fs = require('fs'); axios({ url: 'https://example.com/1666960010753_Me%20Data.xlsx', method: 'GET', responseType: 'arraybuffer', }).then((response) => { const ostream = fs.createWriteStream(`./${filename}`); ostream.write(response.data); ostream.end(); // 必须调用 end() 关闭流,确保所有数据写入磁盘 // 监听错误与完成事件,排查问题 ostream.on('error', (err) => { console.error('文件写入失败:', err); }); ostream.on('finish', () => { console.log('文件写入完成'); }); }).catch((err) => { console.error('请求S3文件失败:', err); });
方案二:使用 stream 类型(适合大文件,更高效)
const axios = require('axios'); const fs = require('fs'); axios({ url: 'https://example.com/1666960010753_Me%20Data.xlsx', method: 'GET', responseType: 'stream', }).then((response) => { const ostream = fs.createWriteStream(`./${filename}`); // 用 pipe 自动处理流的传输与结束 response.data.pipe(ostream); ostream.on('error', (err) => { console.error('文件写入失败:', err); }); ostream.on('finish', () => { console.log('文件写入完成'); }); }).catch((err) => { console.error('请求S3文件失败:', err); });
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

