Azure功能传出存储队列绑定在上下文中不可用

时间:2019-02-14 09:27:25

标签: javascript azure azure-functions

我有一个非常简单的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下的原因是什么?

1 个答案:

答案 0 :(得分:2)

输出绑定在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}'`)
}