首页 > 解决方案 > Azure 函数传出存储队列绑定在上下文中不可用

问题描述

我有一个非常简单的 Azure 函数,其唯一目的是获取 blob 中包含的所有消息并将这些消息放在存储队列中。

我正在运行 Functions 2.x,该函数是用 JavaScript 编写的,并且我已经为存储队列注册了一个 blob 触发器和一个输出绑定。

我遇到的问题是输出绑定在我的函数中不可用。ctx.bindings我正在使用命名输出绑定,因为我将有多个输出绑定。当我将输出绑定名称更改为$return并返回我的数据时,消息会按预期写入队列,但是当我设置不同的名称时,绑定不会显示在上下文中。但是,我可以在ctx.bindingDefinitions.

我正在使用 Azure Function Host 在本地运行代码,并安装了适当的扩展。

我的代码是这样的:

import { Context } from '@azure/functions'

export async function run(ctx: Context , content: string): Promise<void> {
  try {
    const data = JSON.parse(content)

    if (!ctx.bindings[data.queue]) {
      throw new Error(`No output binding defined for queue '${data.queue}'`)
    }

    ctx.bindings[data.queue] = [...data.messages]
  } catch (e) {
    return Promise.reject(e)
  }
}

还有我的function.json:

{
  "disabled": false,
  "bindings": [
   {
    "name": "content",
    "type": "blobTrigger",
    "direction": "in",
    "path": "message-batches/{filename}.txt"
   },
   {
      "type": "queue",
      "direction": "out",
      "name": "message",
      "queueName": "message",
      "connection": "AZURE_STORAGE_CONNECTION_STRING"
    }
  ],
  "scriptFile": "index.js"
 }

我的传入content绑定可用作ctx.bindings.content. 我想我可能在这里遗漏了一些微不足道的东西,但是绑定不显示在下面的原因可能是什么ctx.bindings

标签: javascriptazureazure-functions

解决方案


Context.bindings输出绑定在运行时填充内容之前不可用。

如果我们想检查输出定义是否存在,请转到Context.bindingDefinitions

let flag:boolean = false;

for (let bindingDefinition of ctx.bindingDefinitions) {
    if(bindingDefinition.name == data.queue) {
        flag = true;
        break;
    }
}

if(!flag){
    throw new Error(`No output binding defined for queue '${data.queue}'`)
}

推荐阅读