【问题标题】:Azure Service Bus scheduled message "in" binding undefinedAzure 服务总线计划消息“in”绑定未定义
【发布时间】:2019-10-15 20:33:03
【问题描述】:

我正在使用 @azure/service-bus JavaScript 库从 Azure Functions 发布和订阅有关 Azure 服务总线主题的消息。 为了接收消息,我使用了从模板创建的 Azure 服务总线主题触发器函数,没有进行任何更改。 当我使用 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 服务总线主题触发函数中未定义。

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

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

【问题讨论】:

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


【解决方案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

【讨论】:

    【解决方案2】:

    在新世界(天蓝色函数 .net5)中,您不能再使用代理消息。新的图书馆不适合它。

    功能应用声明不再是 [FunctionName=] 而是 [Function= 您不能再收到“消息”或字节。但只有一个字符串!!!。

    例子;

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

    现在的魔力在 FunctionContext executionContext 您可以从中获取属性

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

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      相关资源
      最近更新 更多