【问题标题】:Use variables in Azure Functions out binding在 Azure Functions 中使用变量出绑定
【发布时间】:2020-10-15 07:35:54
【问题描述】:

我正在使用带有 javascript 的 Azure 函数,我想在我的函数中修改 path 的输出绑定。例如这是我的function.json

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "name": "outputBlob",
      "path": "container/{variableCreatedInFunction}-{rand-guid}",
      "connection": "storagename_STORAGE",
      "direction": "out",
      "type": "blob"
    }
  ]

我想在index.js中设置{variableCreatedInFunction},例如:

module.exports = async function (context, req) {
    const data = req.body
    const date = new Date().toISOString().slice(0, 10)
    const variableCreatedInFunction = `dir/path/${date}`
    if (data) {
        var responseMessage = `Good`
        var statusCode = 200
        context.bindings.outputBlob = data
    } else {
        var responseMessage = `Bad`
        var statusCode = 500
    }
    context.res = {
        status: statusCode,
        body: responseMessage
    };
}
 

没找到办法,可以吗?

【问题讨论】:

  • javascript 不支持命令式绑定模式,所以我们不能使用 IBinder。我们需要从请求的参数或请求的正文中获取值。还有其他疑问吗?
  • 我需要在函数中获取输出 blob 名称。或者至少在函数中获得 rand-guid。那可能吗?我试过这个:var randGuid = context.bindingData.sys.randGuid 但它与绑定中的 guid 不同

标签: javascript node.js azure-functions


【解决方案1】:

绑定在函数执行之前被解析。您可以使用{DateTime} 作为绑定表达式。默认为yyyy-MM-ddTHH-mm-ssZ。您也可以使用{DateTime:yyyy}(以及其他格式模式,根据需要)。

命令式绑定(这是您想要实现的)仅在 C# 和其他 .NET 语言中可用,the docs says

运行时绑定 在 C# 和其他 .NET 语言中,您可以使用 命令式绑定模式,与 function.json 和属性。命令式绑定在以下情况下很有用 绑定参数需要在运行时计算而不是设计 时间。要了解更多信息,请参阅 C# developer referenceC# script developer reference

MS 可能现在也将它添加到 JS 中,因为我很确定我在一年多以前就读过那个确切的部分,但我找不到与它相关的任何内容。也许你可以自己挖掘一下。

如果您的请求内容是 JSON,另一种方法是在请求中包含路径,例如:

{
  "mypath":"a-path",
  "data":"yourdata"
}

然后您就可以像这样进行声明性绑定:

{
  "name": "outputBlob",
  "path": "container/{mypath}-{rand-guid}",
  "connection": "storagename_STORAGE",
  "direction": "out",
  "type": "blob"
}

如果您需要 Blob 的名称/路径,您可能必须将两个函数链接在一起,其中一个用作入口点和路径生成器,而另一个用于处理 Blob(和当然是绑定)。 它会是这样的:

  • 使用HttpTriggerQueue(输出)声明第一个函数。
  • 让第一个函数创建包含{date}-{guid} 的“随机”路径。
  • 在 Queue 输出中插入一条消息,内容为 {"mypath":"2020-10-15-3f3ecf20-1177-4da9-8802-c7ad9ada9a33", "data":"some-data"}(当然,将日期和 guid 替换为您自己生成的值...)
  • QueueTrigger 和你的Blob 声明第二个函数-需要,仍然像以前一样绑定Blob 路径,但没有{rand-guid},只是{mypath}
  • mypath 现在用于 blob 输出(声明性),并且您可以从队列消息中获得信息。

【讨论】:

  • 有什么方法可以在我的函数中获取 blob 名称?
  • @yaniv055 尝试将 outputBlobdirection 更改为 inout 而不是 out,然后调试上下文以查看名称(带有 guid)是否可用。不过,我不确定它是否适用于 JS。
  • 不幸的是它在 js 中不起作用:ReadWrite access is not supported. Pick either Read or Write.
  • @yaniv055 我明白了。如果您真的需要名称,您可以将 2 个函数链接在一起。请参阅更新的答案以获得说明。
【解决方案2】:

在.js中设置动态变量并让绑定知道是不可能的。

值需要提前给出,但是这样可能会达到你的要求:

index.js

module.exports = async function (context, req) {
    context.bindings.outputBlob = "This is a test.";
    context.done();
    context.res = {
        body: 'Success.'
    };
}

function.json

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "name": "outputBlob",
      "path": "test/{test}",
      "connection": "str",
      "direction": "out",
      "type": "blob"
    }
  ]
}

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "str":"DefaultEndpointsProtocol=https;AccountName=0730bowmanwindow;AccountKey=xxxxxx;EndpointSuffix=core.windows.net"
  }
}

或者您可以将输出逻辑放在函数体中。只需使用 javascript sdk。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2018-01-16
    • 2016-10-31
    • 2018-04-20
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多