node.jsazureazureservicebusservicebuscustom-properties

NodeJS - @azure/service-bus : How to pass `userProperties` in message to C# backend


Before, I was using azure-sb package to handle service bus message in NodeJS with below sample code:

let message = {
    body: JSON.stringify(body),
    customProperties: {
        userId: userId
    }
};

However, after changed to use package @azure/service-bus, I needed to change a little bit to get body in C# code as below:

let signMessage = {
    body: body,
    customProperties: { // tried to use userProperties but not okay
        userId: userId
    }
};

However, I still cannot get userProperties successfully in C# or ServiceBus Explorer.


Solution

  • Simple code:

    const { ServiceBusClient } = require("@azure/service-bus");
    
    const connectionString = "Endpoint=sb://bowman1012.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx"
    const topicName = "test";
    
    const messages = [
        { body: "Albert Einstein",
          applicationProperties: {
            userId: 'userId'
          }
        }
     ];
    
     async function main() {
        // create a Service Bus client using the connection string to the Service Bus namespace
        const sbClient = new ServiceBusClient(connectionString);
    
        // createSender() can also be used to create a sender for a queue.
        const sender = sbClient.createSender(topicName);
    
        try {
            // Tries to send all messages in a single batch.
            // Will fail if the messages cannot fit in a batch.
            // await sender.sendMessages(messages);
    
            // create a batch object
            let batch = await sender.createMessageBatch(); 
            for (let i = 0; i < messages.length; i++) {
                // for each message in the arry         
    
                // try to add the message to the batch
                if (!batch.tryAddMessage(messages[i])) {            
                    // if it fails to add the message to the current batch
                    // send the current batch as it is full
                    await sender.sendMessages(batch);
    
                    // then, create a new batch 
                    batch = await sender.createBatch();
    
                    // now, add the message failed to be added to the previous batch to this batch
                    if (!batch.tryAddMessage(messages[i])) {
                        // if it still can't be added to the batch, the message is probably too big to fit in a batch
                        throw new Error("Message too big to fit in a batch");
                    }
                }
            }
    
            // Send the last created batch of messages to the topic
            await sender.sendMessages(batch);
    
            console.log(`Sent a batch of messages to the topic: ${topicName}`);
    
            // Close the sender
            await sender.close();
        } finally {
            await sbClient.close();
        }
    }
    
    // call the main function
    main().catch((err) => {
        console.log("Error occurred: ", err);
        process.exit(1);
     });
    

    It works fine on my side.

    This is the API reference:

    https://learn.microsoft.com/en-us/javascript/api/@azure/service-bus/servicebusmessage?view=azure-node-latest