You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Service Bus Queue发送JSON时报ServiceBusMessage类型错误如何解决

问题原因

TypeError: Provided value for 'message' must be of type: ServiceBusMessage 报错的核心是@azure/service-bus SDK要求所有送入队列的消息必须符合ServiceBusMessage接口定义,你当前直接将JSON解析后的原始业务对象传入tryAddMessage方法,不符合SDK参数要求。

修复方案

只需要将原始业务对象包裹为符合要求的ServiceBusMessage结构即可,核心是将业务数据放入body字段,可同时指定contentType为application/json方便接收端自动解析数据。
修改后的代码片段如下:

module.exports = async function (context, myBlob) {
    context.log("JavaScript blob trigger function processed blob \n Blob:", context.bindingData.blobTrigger, "\n Blob Size:", myBlob.length, "Bytes");
    if(context.bindingData.name.indexOf("json_results") == -1){
        context.log(context.bindingData.name);
        return;
    }

const data = JSON.parse(myBlob.toString());
context.log(data);

// service bus queue
const { ServiceBusClient } = require("@azure/service-bus");
// connection string to your Service Bus namespace
const connectionString = "Endpoint=sb://servicebus.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxx";

const sbClient = new ServiceBusClient(connectionString);

// name of the queue
const queueName = "service-bus-queue";
context.log("Creating queue: ", queueName);

const sender = sbClient.createSender(queueName)

try{
    let batch = await sender.createMessageBatch();
    for (let index=0; index < data.length; index++){
        // 核心修改:将原始JSON对象包裹为ServiceBusMessage结构
        const serviceBusMsg = {
            body: data[index],
            contentType: "application/json"
        }
        if (!batch.tryAddMessage(serviceBusMsg)) {            
            await sender.sendMessages(batch);
            batch = await sender.createMessageBatch();
            if (!batch.tryAddMessage(serviceBusMsg)) {
                throw new Error("Message too big to fit in a batch");
            }
        }
    }
    await sender.sendMessages(batch);

    context.log(`Sent a batch of messages to the queue: ${queueName}`);
    await sender.close();
} finally {
    await sbClient.close();
}

};
接收端注意事项
  • 接收消息时直接读取message.body即可拿到原始JSON对象,SDK会根据contentType自动完成反序列化,无需手动调用JSON.parse
  • 如果未指定contentType,接收端需要手动将message.body转为字符串后再执行JSON解析

内容的提问来源于stack exchange,提问作者abautista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:45:02