将csv数据直接写入节点js中的azure blob

Posted

技术标签:

【中文标题】将csv数据直接写入节点js中的azure blob【英文标题】:Write csv data to directly to azure blob in node js 【发布时间】:2021-06-13 15:16:00 【问题描述】:

我想使用 csv-writer 创建一个 CSV 文件,并将该 csv 上传到 azure blob,我可以创建 csv,将其存储在本地系统上,然后从本地读取并使用 azure-storage 上传到 blob npm。但是我不想在本地文件系统上创建/存储 CSV(因为我在 Prod 上遇到了一些问题),有没有办法创建 CSV 并直接提供给 azure blob 存储,而不将 csv 写入本地文件系统。

一些代码供参考

const csvWriter = createCsvWriter(
        path: `__dirname/$blobName`,
        header: [
           id: "id", title: "name" ,
        ],
      );

      await csvWriter
        .writeRecords(csvData)
        .then(() => console.log("file successfully written")); 

一旦在本地创建了这个 csv,使用 fs 模块从那里读取它,然后使用“blobService.createBlockBlobFromStream”函数上传到 blob。

您能否建议我如何直接将 azure blob 存储路径提供给 csvWriter?或者还有其他方法可以实现吗?

【问题讨论】:

你试过this吗? 实际上没有,但这怎么可能相关呢?我正在使用 csv-writer 包,它需要创建 csv 的路径,我想将其直接上传到 azure blob 存储。能详细点吗? 【参考方案1】:

请尝试下面的代码。

const BlobServiceClient, StorageSharedKeyCredential = require('@azure/storage-blob');
const createCsvStringifier = require('csv-writer').createObjectCsvStringifier;
const accountName = 'account-name';
const accountKey = 'account-key';
const container = 'container-name';
const blobName = 'text.csv';

const csvStringifier = createCsvStringifier(
    header: [
        id: 'name', title: 'NAME',
        id: 'lang', title: 'LANGUAGE'
    ]
);
const records = [
    name: 'Bob',  lang: 'French, English',
    name: 'Mary', lang: 'English'
];
const headers = csvStringifier.getHeaderString();
const data = csvStringifier.stringifyRecords(records);
const blobData = `$headers$data`;
const credentials = new StorageSharedKeyCredential(accountName, accountKey);
const blobServiceClient = new BlobServiceClient(`https://$accountName.blob.core.windows.net`, credentials);
const containerClient = blobServiceClient.getContainerClient(container);
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
const options = 
    blobHTTPHeaders: 
        blobContentType: 'text/csv'
    
;
blockBlobClient.uploadData(Buffer.from(blobData), options)
.then((result) => 
    console.log('blob uploaded successfully!');
    console.log(result);
)
.catch((error) => 
    console.log('failed to upload blob');
    console.log(error);
);

这段代码中有两件事:

    如果您不想将数据写入磁盘,请使用createObjectCsvStringifier

    使用@azure/storage-blob 节点包而不是azure-storage 包,因为前者是较新的包,而后者已被弃用。


更新

这是使用azure-storage 包的代码。

const azure = require('azure-storage');
const createCsvStringifier = require('csv-writer').createObjectCsvStringifier;
const accountName = 'account-name';
const accountKey = 'account-key';
const container = 'container-name';
const blobName = 'text.csv';

const csvStringifier = createCsvStringifier(
    header: [
        id: 'name', title: 'NAME',
        id: 'lang', title: 'LANGUAGE'
    ]
);
const records = [
    name: 'Bob',  lang: 'French, English',
    name: 'Mary', lang: 'English'
];
const headers = csvStringifier.getHeaderString();
const data = csvStringifier.stringifyRecords(records);
const blobData = `$headers$data`;

const blobService = azure.createBlobService(accountName, accountKey);
const options = 
    contentSettings: 
        contentType: 'text/csv'
    

blobService.createBlockBlobFromText(container, blobName, blobData, options, (error, response, result) => 
    if (error) 
        console.log('failed to upload blob');
        console.log(error);
     else 
        console.log('blob uploaded successfully!');
        console.log(result);
    
);

【讨论】:

感谢这在本地对我有用,但是当我在 azure 上部署解决方案时,它遇到了一些问题:未处理的拒绝:Promise Promise TypeError: Cannot read property 'MAX_LENGTH ' 未定义在 Object. (D:\home\site\wwwroot\node_modules\@azure\storage-common\src\PooledBuffer.ts:11:52) 在 Module._compile (module.js:570:32) ) 你能帮我吗? 我查看了源代码,似乎错误来自以下代码行var maxBufferLength = require("buffer").constants.MAX_LENGTH;。我不知道为什么。您在 Azure 中的哪个位置运行代码 - Function、WebApp 还是其他? 你可能想在这里创建一个新问题:github.com/Azure/azure-sdk-for-js/issues。 当然谢谢,它有帮助,同样的实现可以在“azure-storage”包的帮助下完成吗?我试图将上面的代码转换为使用“azure-storage”包,但不能,你能帮我解决这个问题吗? 更新了我的答案并使用azure-storage 包提供了示例代码。不确定当代码在 Azure 中运行时是否会遇到相同的错误。 HTH。

以上是关于将csv数据直接写入节点js中的azure blob的主要内容,如果未能解决你的问题,请参考以下文章

Azure 数据工厂将数据流映射到 CSV 接收器导致零字节文件

如何使用 fast-csv 将特殊字符写入节点中的 csv 文件

Azure数据工厂映射数据流到CSV接收器的结果为零字节文件

python将数据帧作为csv写入天蓝色存储帐户

将文件写入节点js中的特定文件夹?

使用 node.js 和 node-csv-parser(节点模块)提示 csv 文件下载为弹出窗口