Node.js中如何读取InputStreamResource?转换为XLSX/JSON求助
解决方案:将InputStreamResource响应转换为XLSX或JSON
从你的代码来看,你是用Node.js的https.request调用API,返回的流对应Java端的InputStreamResource。下面分两种场景给出具体实现:
一、转换为XLSX文件
根据API返回的内容类型,分两种处理方式:
1. API返回Excel二进制流(直接保存)
如果接口本身返回的就是XLSX格式的二进制流,直接将响应流写入文件即可:
const https = require('https'); const fs = require('fs'); const options = { host: 'xxxxxxxxxxxxxxxxx', port: xxxxx, path: '/eeeeee/axxxxxxx?code=' + req.query.code, method: 'GET', headers:{ 'user_id': req.headers.user_id, 'access_token': req.headers.access_token } }; https.request(options, function (res) { // 校验响应类型是否为Excel if (res.headers['content-type']?.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) { const fileStream = fs.createWriteStream('output.xlsx'); res.pipe(fileStream); fileStream.on('finish', () => { console.log('XLSX文件已成功保存'); }); fileStream.on('error', (err) => { console.error('保存文件失败:', err); }); } else { console.error('响应不是Excel格式,请检查接口返回'); } }).on('error', (err) => { console.error('请求API失败:', err); });
2. API返回JSON流(转换为XLSX)
如果接口返回的是JSON数据,需要先解析再用xlsx库生成Excel:
首先安装依赖:
npm install xlsx
然后实现转换逻辑:
const https = require('https'); const fs = require('fs'); const XLSX = require('xlsx'); const options = { host: 'xxxxxxxxxxxxxxxxx', port: xxxxx, path: '/eeeeee/axxxxxxx?code=' + req.query.code, method: 'GET', headers:{ 'user_id': req.headers.user_id, 'access_token': req.headers.access_token } }; https.request(options, function (res) { let rawData = ''; res.on('data', (chunk) => { rawData += chunk; }); res.on('end', () => { try { const jsonData = JSON.parse(rawData); // 将JSON转为工作表 const worksheet = XLSX.utils.json_to_sheet(jsonData); // 创建工作簿并添加工作表 const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 保存为XLSX文件 XLSX.writeFile(workbook, 'output.xlsx'); console.log('JSON转XLSX成功'); } catch (err) { console.error('解析JSON或转换Excel失败:', err); } }); }).on('error', (err) => { console.error('请求API失败:', err); });
二、转换为JSON格式
同样分两种场景处理:
1. API返回Excel二进制流(转换为JSON)
用xlsx库解析Excel流并转JSON:
const https = require('https'); const fs = require('fs'); const XLSX = require('xlsx'); const options = { host: 'xxxxxxxxxxxxxxxxx', port: xxxxx, path: '/eeeeee/axxxxxxx?code=' + req.query.code, method: 'GET', headers:{ 'user_id': req.headers.user_id, 'access_token': req.headers.access_token } }; https.request(options, function (res) { const chunks = []; res.on('data', (chunk) => chunks.push(chunk)); res.on('end', () => { try { const buffer = Buffer.concat(chunks); // 解析Excel文件 const workbook = XLSX.read(buffer, { type: 'buffer' }); // 获取第一个工作表的数据 const worksheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[worksheetName]; // 转换为JSON const jsonData = XLSX.utils.sheet_to_json(worksheet); console.log('Excel转JSON结果:', jsonData); // 可选:保存为JSON文件 fs.writeFileSync('output.json', JSON.stringify(jsonData, null, 2)); } catch (err) { console.error('解析Excel或转换JSON失败:', err); } }); }).on('error', (err) => { console.error('请求API失败:', err); });
2. API返回JSON流(直接解析)
直接读取流并解析为JSON对象:
const https = require('https'); const fs = require('fs'); const { StringDecoder } = require('string_decoder'); const options = { host: 'xxxxxxxxxxxxxxxxx', port: xxxxx, path: '/eeeeee/axxxxxxx?code=' + req.query.code, method: 'GET', headers:{ 'user_id': req.headers.user_id, 'access_token': req.headers.access_token } }; https.request(options, function (res) { const decoder = new StringDecoder('utf8'); let rawData = ''; res.on('data', (chunk) => { rawData += decoder.write(chunk); }); res.on('end', () => { rawData += decoder.end(); try { const jsonData = JSON.parse(rawData); console.log('解析后的JSON数据:', jsonData); // 可选:保存为JSON文件 fs.writeFileSync('output.json', JSON.stringify(jsonData, null, 2)); } catch (err) { console.error('解析JSON失败:', err); } }); }).on('error', (err) => { console.error('请求API失败:', err); });
小提示
- 建议先校验响应的
Content-Type头,能更精准地处理不同类型的返回 - 如果处理大文件,优先用流的方式操作,避免内存溢出
xlsx库支持Node.js 12及以上版本,安装时注意版本兼容性
内容的提问来源于stack exchange,提问作者Rahul Kumar
相关产品推荐
相关产品推荐

