nats-io / nats.go

Golang client for NATS, the cloud native messaging system.
https://nats.io
Apache License 2.0
5.47k stars 688 forks source link

Golang client JSON encoder reply response coming back in base64 #889

Open saul-data opened 2 years ago

saul-data commented 2 years ago

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))
})
karanpratapsingh commented 2 years ago

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"})
}