我正在尝试使用 AMQP 在消息正文中发送 JSON 并接收它。消息发送没有任何错误,但是我无法在另一端解码它。我得到一个 unexpected end of JSON input
错误。
JSON:
var jsonStr = []byte(`
{
"name": "Test",
"phone_number": "12345"
}`)
err = files.SendMessageToCore(jsonStr, "event.saveorder")
if err != nil {
logr.Error("Error sending a message to rabbitmq:", fmt.Sprintf("%v", err))
}
SendMessageToCore 函数:func SendMessageToCore(body []byte, routingKey string) error {
pb, err := GetRabbitPublisher()
if err != nil {
return err
}
var message amqp.Message
message.Exchange = "example"
message.RoutingKey = routingKey
message.Body = body
messageByte, err := json.Marshal(message)
if err != nil {
return err
}
err = (*pb).Publish(amqp.Message{Exchange: message.Exchange, RoutingKey: message.RoutingKey, Body: messageByte})
if err != nil {
return err
}
fmt.Println("Message was successfully sent")
return nil
}解码部分:
func SaveOrderEventHandler(mes amqp.Message) *amqp.Message {
var incomingMessage amqp.Message
if err := json.Unmarshal(mes.Body, &incomingMessage); err != nil {
fmt.Println(err)
return nil
}
var user foodDomain.User
if err := json.Unmarshal(incomingMessage.Body, &user); err != nil {
fmt.Println("Error unmarshalling incomingMessage body: ", err) //Error appears here
return nil
}
fmt.Println(user.PhoneNumber)
return nil
}用户结构:
type User struct {
Name string `json:"name"`
PhoneNumber string `json:"phone_number"`
}
最佳答案
在您的 SendMessageToCore
你已经初始化了amqb.Message
.无需在 Publish
中重新初始化func,只需传递您初始化的message
.另外,您的 json
字符串 body
已经在 jsonByte
,所以不需要marshal
再一次。
例如 -
func SendMessageToCore(body []byte, routingKey string) error {
pb, err := GetRabbitPublisher()
if err != nil {
return err
}
var message amqp.Message
message.Exchange = "example"
message.RoutingKey = routingKey
message.Body = body
err = (*pb).Publish(message)
if err != nil {
return err
}
fmt.Println("Message was successfully sent")
return nil
}
还有你的mes
已经在 amqp.Message
类型,因此无需解码 mes.Body
进入 amqp.Message
类型变量。直接
unmarshal
您的 mes.Body
进入 user
.func SaveOrderEventHandler(mes amqp.Message) *amqp.Message {
var user foodDomain.User
if err := json.Unmarshal(mes.Body, &user); err != nil {
fmt.Println(err)
return nil
}
fmt.Println(user.PhoneNumber)
return nil
}
关于go - 从 amqp 解码消息正文时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64021689/