使用NodeJS读取Azure Blob Storage的CSV文件时setHeader未定义报错如何解决
报错原因与解决方案
错误根因
你手动执行chkFile();时未传入HTTP响应对象res,导致getBlobDataToStreamm方法接收的res参数为undefined,调用res.setHeader时触发类型错误。
解决方案
根据你的使用场景选择对应处理方式即可:
场景1:代码作为HTTP接口使用(供前端/客户端调用下载)
这种情况不需要手动调用chkFile(),只要把这个函数挂载到你的服务路由上即可,以Express框架为例:
// 示例Express路由配置 const express = require('express'); const app = express(); // 挂载接口,访问该地址时Express会自动传入req、res对象 app.get('/download-csv', chkFile); // 启动服务 app.listen(3000, () => console.log('服务启动在3000端口'));
完成配置后访问http://localhost:3000/download-csv就能正常触发下载,不会报错。
场景2:本地直接运行处理CSV(不需要走HTTP响应)
这种情况不需要用到res对象,修改getBlobDataToStreamm逻辑,直接将blob流写入本地文件即可:
// 修改后的blobstorage方法 const getBlobDataToLocal = async function(req){ try{ const fs = require('fs'); const { storageName, blobFileName, downloadFileName } = req; const writeStream = fs.createWriteStream(downloadFileName); return new Promise((resolve, reject) => { blobService.getBlobToStream(storageName, blobFileName, writeStream, function(error, result, response) { if(error){ console.log('下载出错',error); reject(error); }else{ console.log('下载完成',result); resolve(downloadFileName); } }) }) }catch(err){ console.log("捕获错误",err); throw err; } } // 调用方式 var chkFile = async function () { let reqq = { storageName:"consent", blobFileName: "filename", downloadFileName:"filenamee" } let localFilePath = await blob.getBlobDataToLocal(reqq) // 接下来就可以读取本地的CSV文件转JSON处理了 console.log('本地文件路径', localFilePath) } chkFile();
内容的提问来源于stack exchange,提问作者sasi
相关产品推荐
相关产品推荐

