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
相关产品推荐
相关产品推荐

