nats.go icon indicating copy to clipboard operation
nats.go copied to clipboard

Golang client JSON encoder reply response coming back in base64

Open saul-data opened this issue 3 years ago • 1 comments

This is my code. Sending messages is fine. The response is coming back as a base64 reply. I can't seem to figure it out.

connection

NATSencoded, _ = nats.NewEncodedConn(NATS, nats.JSON_ENCODER)
if err != nil {
   log.Fatal("Failed to connect to encoded NATS")
}

Sending a message with requested reply


type person struct {
  Name    string
  Address string
  Age     int
}

var response interface{}

msg := &person{Name: "derek", Age: 22, Address: "85 Second St"}
err := NATSEncoded.Request("topic1", msg, response, time.Second)

log.Println(string(response))

Responding to message

NATSencoded.Subscribe("topic1", func(m *nats.Msg) {
  sendjson, _ := json.Marshal(`{"response":"ok"}`)
  NATSencoded.Publish(m.Reply, sendjson)
  log.Println(string(m.Data))
})

saul-data avatar Jan 26 '22 11:01 saul-data

Hi @saul-data, here's how I'm using it with nats.JSON_ENCODER, I'm thinking we don't need to marshal json when we need to reply?

package internal

import (
	"github.com/nats-io/nats.go"
	"fmt"
)

type PubSub struct {
	conn *nats.EncodedConn
}

func NewPubSub(addr string) PubSub {
	conn, err := nats.Connect(addr)

	if err != nil {
		fmt.Println(err)
	}

	enc, err := nats.NewEncodedConn(conn, nats.JSON_ENCODER)

	if err != nil {
		fmt.Println(err)
	}

	return PubSub{enc}
}

func (p PubSub) Close() {
	p.conn.Close()
}

func (p *PubSub) Subscribe(event string, handler interface{}) *nats.Subscription {
	sub, err := p.conn.Subscribe(event, handler)

	if err != nil {
		fmt.Println(err)
	}

	return sub
}

func (p *PubSub) Publish(event string, payload interface{}) {
	err := p.conn.Publish(event, payload)

	if err != nil {
		fmt.Println(err)
	}
}

Pub sub example:

type Payload {
  Hello string
}

func main() {
        pubsub := internal.NewPubSub("YOUR_NATS_URL")
        defer pubsub.Close()

	pubsub.Subscribe("some_subject", func(p Payload) {
		fmt.Println(p.Hello)
	})

        pubsub.Publish("some_subject", Payload{Hello: "hi hi hi"})
}

karanpratapsingh avatar Feb 05 '22 10:02 karanpratapsingh