JSON for Message Payloads in Messaging
The basic structure of a NATS message modeled in the client libraries includes the subject the message was published to, the application-defined payload, and an optional set of headers (for requests, there is also a reply-to subject). The payload is a sequence of bytes, so it is up to the application to define how to serialize and deserialize the payload.
JSON is ubiquitous and simple data-interchange format that is supported in virtually all programming languages. This example demonstrates how to serialize and deserialize a message payload using a JSON library.
Code
import { connect } from "https://deno.land/x/nats@v1.16.0/src/mod.ts";
Get the passed NATS_URL or fallback to the default. This can be a comma-separated string.
const servers = Deno.env.get("NATS_URL") || "nats://localhost:4222";
Create a client connection to an available NATS server.
const nc = await connect({
servers: servers.split(","),
});
Create a subscription that receives two messages. One message will contain a valid serialized payload and the other will not.
const sub = await nc.subscribe("foo", { max: 2 });
(async () => {
for await (const m of sub) {
try {
payload of the message m.data
is an Uint8Array
m.json() parses the JSON payload - this can fail.
m.string() parses the payload as a string
console.log(m.json());
} catch (err) {
console.log(`err: ${err.message}: '${m.string()}'`);
}
}
})();
publish the messages
nc.publish("foo", JSON.stringify({ foo: "bar", bar: 27 }));
nc.publish("foo", "not json");
await nc.drain();
Output
[1A[1B[0G[?25l[+] Building 0.0s (0/0) [?25h[1A[1B[0G[?25l[+] Building 0.0s (0/0) [?25h{ foo: "bar", bar: 27 } err: Bad JSON: 'not json'
import the library - in node.js
import {connect, etc} from "nats";
or if not doing a module,const {connect, etc} = require("nats");