当前位置: 首页 > 知识库问答 >
问题:

Azure函数:如何读取NodeJ的blob输入?

舒枫涟
2023-03-14

我设置了一个azure函数,它是由添加到特定容器的blob触发的。blob是一个. zip文件,我的意图是使用adm-zip将blob提取到目录中,然后读取内容。我对这里的留档感到困惑:https://github.com/Azure/azure-content/blob/master/articles/azure-functions/functions-bindings-storage.md#blob-trigger-supported-types它说输入参数可以是Object或String。我在function.json中看不到任何地方可以指定我希望输入是什么。

在我下面的代码中,它的类型似乎是一个字符串,但由于它不打印任何东西,我假设它实际上是一个表示文件内容的字节缓冲区。为了解决这个问题,我尝试将缓冲区写入本地文件,但是没有成功。它没有抛出错误,也没有将< code >保存的blob打印到...

在我的函数.json中,我有这个:

{
  "bindings": [
    {
      "name": "xmlZipBlob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "balancedataxml",
      "connection": "sc2iq_STORAGE"
    }
  ],
  "disabled": false
}

然后我有xmlZipBlob作为我的函数的第二个参数:

var fs = require('fs');

module.exports = function (context, xmlZipBlob) {
    context.log('Node.js blob trigger function processed blob:', xmlZipBlob);
    context.log(`typeof xmlZipBlob:`, typeof xmlZipBlob);

    fs.writeFile('xmlZip.zip', xmlZipBlob, (err) => {
        if (err) {
            throw err;
        }

        context.log('saved blob to loal file called xmlZip.zip');
        context.done();
    });
};

1. Blob 函数的输入参数的类型是什么?

2. 如何控制输入参数是对象还是字符串?

3. 是否可以使用本机节点fs模块写入本地文件系统以提取.zip文件?

更新:我相信这是由于尝试使用文件系统而失败的,并在这里打开了单独的更孤立的问题:Azure函数:Nodejs,使用文件系统时有哪些限制/局限?

4.有没有比使用.zip文件更好的选择?

在解决这个问题之前,我想我会想出不同的解决方案来处理.zip文件。要么使用流在内存中执行所有操作,要么避免将文件全部.zip,而只是从较小的 xml 文件中构建一个更大的 xml 文件。无论哪种方式,似乎都应该有一些文档或警告,说明将依赖于文件系统的节点函数移植到 azure 函数需要什么。

共有1个答案

古扬
2023-03-14

在节点函数中(与在函数定义中声明参数类型的C#相反),输入类型默认为string。如果试图绑定到二进制数据,可以通过dataType属性在function.json绑定中指明,例如:

{
  "bindings": [
    {
      "name": "xmlZipBlob",
      "type": "blobTrigger",
      "dataType": "binary",
      "direction": "in",
      "path": "balancedataxml",
      "connection": "sc2iq_STORAGE"
    }
  ]
}

这将把blob输入作为节点缓冲区传递给函数。请注意,这不是流-缓冲区完全读取到内存中。

关于您关于文件系统访问的问题,我在您的另一篇SO帖子中回答了该问题:)

 类似资料:
  • 我想利用AZURE Function应用程序从AZURE BLOB存储中读取XLSX文件。该函数应由REST API调用来调用。我可以访问blob并下载文件,但我很难用pandas直接读取文件内容。我找了几个小时,但是找不到解决办法。我的最新方法是这样的: 在MS homepage*上,有一个从blob下载文件并随后进行处理的例子,但由于我使用的是功能应用程序,如果我没有遗漏任何内容,那么首先下载

  • 我正在尝试使用 azure 函数读取 azure blob 内容。 容器名称始终相同,Blob名称由触发该函数的队列消息传递。 当我运行此函数时,函数超时(超过5分钟)。 带有blob名称的队列消息是正确的并显示出来,blob只包含一个长json,大约是292kb。 我尝试在创建新blob时直接触发该函数,但它返回了一个带有流的对象,您知道任何方法使该流可读吗? 使用上面的代码,我可以正确获取bl

  • 我是数据库管理员的新手。我编写示例代码来读取Azure数据库管理员中的存储Blob。 它抛出错误: 我猜它在WASBS链接中没有附加SAS令牌,所以它没有读取数据的权限。 如何在wasbs链接中连接SAS。

  • 我有一个Azure函数,每当图像上传到Azure存储帐户中的容器时就会触发该函数。我读流并做一些动作。 我还想获取触发函数的blob的uri,但我如何做到这一点?我必须使用额外的输入/输出吗?

  • 我有一个map-reduce作业,并且reducer获得一个驻留在Azure Blob存储中的文件的绝对地址,并且reducer应该打开它并读取它的内容。在配置Hadoop集群(HDInsight)时,我添加了包含文件的存储帐户。因此,还原器必须有权访问这个Blob存储,但Blob存储不是我的作业的默认HDFS存储。我的reducer中有以下代码,但它给了我一个FileNotFound错误消息。

  • 我是Azure Function应用程序中blob触发器的新手,需要一些帮助。我正在努力寻找有关如何重命名触发该函数的blob的资源。 我有一个函数应用程序,当一个新的blob被上传到容器时触发,文件被处理,我需要一种方法来将其“标记”为已处理,因此我想重命名blob。 这是我的职责: 我该如何重命名该文件?在这种情况下有可能吗?