首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用@azure/storage-blob附加blob文件?(NodeJS)

如何使用@azure/storage-blob附加blob文件?(NodeJS)
EN

Stack Overflow用户
提问于 2022-01-09 07:35:22
回答 1查看 683关注 0票数 2

blob存储中的文件"mainfile.json“包含以下内容:

代码语言:javascript
复制
[
  { "name": "abc", "id": "01", "location": "random" },
  { "month": "Jan", "project": "50%", "training": "50%" },
]

我试图添加的数据如下:

代码语言:javascript
复制
{"month": "Feb", "project":"60%", "training":"40%"}

我希望是这样的:

代码语言:javascript
复制
[
  { "name": "abc", "id": "01", "location": "random" },
  { "month": "Jan", "project": "50%", "training": "50%" },
  {"month": "Feb", "project":"60%", "training":"40%"}
]

我使用@azure/storage-blob来执行相同的操作,下面是我的代码:

代码语言:javascript
复制
const blobServiceClient = require("./getCred");
const fs = require("fs");

async function appendBlob() {
  const containerClient =
    blobServiceClient.getContainerClient("containername");
  //gets the main content from a blob
  const blobClient = containerClient.getBlobClient("mainfile.json");
  //the new appended content gets written into this blob
  const blockBlobClient = containerClient.getBlockBlobClient("data.json");
  // the data that needs to be appended
  const data = fs.readFileSync("new-data.json", "utf-8", (err) => {
    if (err) {
      console.log("File not read");
    }
  });

  // Get blob content from position 0 to the end
  // In Node.js, get downloaded data by accessing downloadBlockBlobResponse.readableStreamBody
  const downloadBlockBlobResponse = await blobClient.download();
  const downloaded = (
    await streamToBuffer(downloadBlockBlobResponse.readableStreamBody)
  ).toString();
  const append = await appendingFile(downloaded, data);

  const uploadBlobResponse = await blockBlobClient.upload(
    append,
    append.length
  );
  console.log(
    `Uploaded block blob to testing.json successfully`,
    uploadBlobResponse.requestId
  );

  // [Node.js only] A helper method used to read a Node.js readable stream into a Buffer
  async function streamToBuffer(readableStream) {
    return new Promise((resolve, reject) => {
      const chunks = [];
      readableStream.on("data", (data) => {
        chunks.push(data instanceof Buffer ? data : Buffer.from(data));
      });
      readableStream.on("end", () => {
        resolve(Buffer.concat(chunks));
      });
      readableStream.on("error", reject);
    });
  }

  async function appendingFile(content, toBeAdded) {
    return new Promise((resolve, reject) => {
      let temp = content.concat(toBeAdded);
      console.log(temp);
      resolve(temp);
      reject(new Error("Error occurred"));
    });
  }
}

但我得到的输出如下:

代码语言:javascript
复制
[
  {
    "name": "KK",
    "id": "01",
    "location": "chennai"
  },
  {
    "month": "December",
    "project": "50%",
    "training": "50%"
  }
]
{
  "month": "January",
  "adaptive-cards": "50%",
  "azure-func-app": "50%"
}

我的整个方法可能是错误的,因为我刚开始编写代码。请帮我处理这个。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-09 07:56:18

您的代码没有任何问题,而且运行正常。

问题在于您对blob存储的理解。Azure存储blob (任何类型的blob -块、追加或页面)并不真正知道是否要向JSON数组添加元素。对于blob存储,它只是一个字节块。

您需要做的是将blob读入字符串,使用JSON.parse创建JSON数组对象并将数据添加到该对象。拥有该对象后,使用JSON.stringify将其转换为字符串,并重新上传该字符串(即覆盖blob)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70639321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档