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

时间:2016-08-24 04:58:35

标签: node.js azure-functions

我已经设置了一个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中看到任何地方来指定我想要输入的内容。

在我的下面的代码中,类型似乎是一个字符串,但由于它没有打印任何东西,我认为它实际上是一个表示文件内容的字节缓冲区。为了使用它,我试图将缓冲区写入本地文件,但它没有成功。它没有抛出错误或打印出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。 blob函数的输入参数的类型是什么?

2。如何控制输入参数是Object还是String?

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

更新:我认为这是因为尝试使用文件系统而失败,并在此处打开了单独的更独立的问题: Azure Functions: Nodejs, What are restrictions / limitations when using file system?

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

在此问题解决之前,我想我会提出不同的解决方案来处理.zip文件。要么在内存中使用流做一切,要么一起避免使用.zip文件,只需从较小的xml文件中构建更大的xml文件。无论哪种方式,似乎应该有一些文档或警告,将依赖于文件系统的节点函数移植到azure函数所需的内容。

1 个答案:

答案 0 :(得分:8)

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

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

这会将blob输入作为节点缓冲区传递给您的函数。请注意,这不是流式传输 - 缓冲区完全读入内存。

关于你关于文件系统访问的问题,我在你的另一篇SO帖子上回答了这个问题:)