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