Azure Functions: 如何在Node.js中读取Blob输入?

6
我已经设置了一个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 其中说输入参数可以是对象或字符串。我没有在function.json中看到任何地方可以指定我想要的输入。
在我的下面的代码中,类型似乎是一个字符串,但由于它没有打印出任何东西,我假设它实际上是表示文件内容的字节缓冲区。为了处理这个问题,我尝试将缓冲区写入本地文件,但没有成功。它没有抛出错误或打印出“saved blob to…”。 在我的function.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.函数blobs的输入参数类型是什么?

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

3.是否可以使用本地文件系统来提取.zip文件的原生节点fs模块?

更新:我认为这个问题失败是因为尝试使用文件系统并已经在这里打开了一个更加隔离的问题: Azure Functions: Nodejs, What are restrictions / limitations when using file system?

4.有没有比使用.zip文件更好的替代方案?

在解决这个问题之前,我认为我将需要想出不同的解决方案来处理.zip文件。 可以使用流在内存中完成所有操作,或者完全避免使用.zip文件,而只需将较小的xml文件组合成较大的xml文件。 无论哪种方式,似乎都应该有一些文档或警告,以便将依赖于文件系统的节点函数移植到Azure函数。

1个回答

11

在 Node 中的函数(与在 C# 中声明函数参数类型不同),输入类型默认为字符串。如果您想绑定二进制数据,可以通过函数.json 绑定中的 dataType 属性进行指示,例如:

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

这将把Blob输入作为Node缓冲区传递到您的函数中。请注意,这不是流式传输 - 缓冲区完全读入内存。

关于您在文件系统访问方面的问题,我已经在您的其他SO帖子上回答了:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接