Azure Functions:如何读取 nodejs 的 blob 输入?
Azure Functions: How to read blob input for nodejs?
我设置了一个 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. blob 函数的输入参数类型是什么?
2。如何控制输入参数是Object还是String?
3。是否可以使用本机节点 fs
模块写入本地文件系统以提取 .zip 文件?
更新:我认为这是由于尝试使用文件系统而失败,并在此处打开了单独的更孤立的问题:
4.有没有比使用 .zip 文件更好的选择?
在解决这个问题之前,我想我会想出不同的解决方案来处理 .zip 文件。要么用流在内存中做所有事情,要么避免一起使用 .zip 文件,只是从较小的 xml 文件构建一个更大的 xml 文件。无论哪种方式,似乎应该有一些文档或警告,说明将依赖于文件系统的节点函数移植到 azure 函数需要什么。
在 Node 函数中(与在函数定义中声明参数类型的 C# 不同)输入类型默认为字符串。如果您尝试绑定到二进制数据,您可以通过 dataType 属性 在 function.json 绑定中指明,例如:
{
"bindings": [
{
"name": "xmlZipBlob",
"type": "blobTrigger",
"dataType": "binary",
"direction": "in",
"path": "balancedataxml",
"connection": "sc2iq_STORAGE"
}
]
}
这会将 blob 输入作为节点缓冲区传递给您的函数。请注意,这不是流式传输 - 缓冲区被完全读入内存。
关于你关于文件系统访问的问题,我在你的另一个 SO post :)
上回答了这个问题
我设置了一个 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. blob 函数的输入参数类型是什么?
2。如何控制输入参数是Object还是String?
3。是否可以使用本机节点 fs
模块写入本地文件系统以提取 .zip 文件?
更新:我认为这是由于尝试使用文件系统而失败,并在此处打开了单独的更孤立的问题:
4.有没有比使用 .zip 文件更好的选择?
在解决这个问题之前,我想我会想出不同的解决方案来处理 .zip 文件。要么用流在内存中做所有事情,要么避免一起使用 .zip 文件,只是从较小的 xml 文件构建一个更大的 xml 文件。无论哪种方式,似乎应该有一些文档或警告,说明将依赖于文件系统的节点函数移植到 azure 函数需要什么。
在 Node 函数中(与在函数定义中声明参数类型的 C# 不同)输入类型默认为字符串。如果您尝试绑定到二进制数据,您可以通过 dataType 属性 在 function.json 绑定中指明,例如:
{
"bindings": [
{
"name": "xmlZipBlob",
"type": "blobTrigger",
"dataType": "binary",
"direction": "in",
"path": "balancedataxml",
"connection": "sc2iq_STORAGE"
}
]
}
这会将 blob 输入作为节点缓冲区传递给您的函数。请注意,这不是流式传输 - 缓冲区被完全读入内存。
关于你关于文件系统访问的问题,我在你的另一个 SO post :)
上回答了这个问题