nats.go
nats.go copied to clipboard
Golang client JSON encoder reply response coming back in base64
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))
})
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"})
}