Azure Service Bus预定消息“中”绑定未定义

时间:2019-05-30 07:50:18

标签: javascript node.js azure azure-functions azureservicebus

我正在使用@ azure / service-bus JavaScript库从Azure Functions发布和订阅Azure Service Bus主题上的消息。 为了接收消息,我使用了从模板创建的Azure Service Bus Topic触发函数,没有进行任何更改。 当我使用sender.send(message)发布消息时,我会收到很好的消息。

import { AzureFunction, Context, HttpRequest } from "@azure/functions"
import * as sb from "@azure/service-bus"

const PublishToServiceBus: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    const eventDoc = req.body;
    const serviceBusConnectionString = process.env["ServiceBusConnection"];
    const topicName = process.env["TopicName"]';
    const sbClient = sb.ServiceBusClient.createFromConnectionString(serviceBusConnectionString);
    const topicClient = sbClient.createTopicClient(topicName);
    const sender = topicClient.createSender();

    const message: sb.SendableMessageInfo = { body: eventDoc };

    // this works
    sender.send(message);

    // this creates message without body?
    const scheduledEnqueueTimeUtc = new Date(Date.now() + 10000);
    sender.scheduleMessages(scheduledEnqueueTimeUtc, [message]);

};
export default PublishToServiceBus;

但是当我使用sender.scheduleMessages()安排消息时,我的传入绑定变量在Azure Service Bus Topic触发函数中未定义。

import { AzureFunction, Context } from "@azure/functions"

const serviceBusTopicTrigger: AzureFunction = async function (context: Context, mySbMsg: any): Promise<void> {
    context.log('ServiceBus topic trigger function processed message', mySbMsg);
};
export default serviceBusTopicTrigger;

输出:ServiceBus topic trigger function processed message undefined

这是图书馆的问题,还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

此问题是由@ azure / service-bus sdk中的错误引起的。

解决方法

  • "@azure/amqp-common"库中导入DefaultDataTransformer
    • 在打字稿中,import { DefaultDataTransformer } from "@azure/amqp-common";
    • 在javascript中,const { DefaultDataTransformer } = require("@azure/amqp-common");
  • 在调用scheduleMessage()方法以发送消息之前更新消息正文,如下所示
    1. 实例化sdk使用的数据转换器:
      • const dt = new DefaultDataTransformer();
    2. 当您需要安排邮件时,请在发送之前对邮件正文进行编码:
      • message.body = dt.encode(message.body);

有关此错误的更多参考和调查-Azure/azure-sdk-for-js#6816

答案 1 :(得分:1)

在新世界(azure 函数 .net5)中,您不能再使用代理消息。新图书馆不能满足它。

函数应用声明不再是 [FunctionName=] 而是 [Function= 您无法再接收“消息”或字节。但只有一个字符串!!!。

示例;

[函数("TestFA")] public async Task Run([ServiceBusTrigger(topicName,subscribeName, Connection = ???)] string messageText, string id, FunctionContext executionContext)

魔法现在在 FunctionContext executionContext 你可以从中获取属性

例如 KeyValuePair props = executionContext.BindingContext.BindingData.Where(x => x.Key == "UserProperties").FirstOrDefault();