英文:
How to get message value in gRPC stream interceptor
问题
我在服务器端实现了一个 gRPC 流拦截器,代码如下:
// 定义服务:
// rpc searchProducts(google.protobuf.StringValue) returns (stream Product);
func (w *wrappedStream) RecvMsg(m interface{}) error {
    log.Printf("%T, %v", m, m)
    return w.ServerStream.RecvMsg(m)
}
// 打印日志:
// *wrapperspb.StringValue, 
使用 %T 可以正确打印出消息类型,但使用 %v 打印的消息值为空白。
我确定服务器端接收到了正确的消息,因为它向客户端返回了正确的内容。
在客户端中,拦截器包装器 RecvMsg 也没有起作用。
英文:
I have implement a gRPC stream interceptor in Server like this:
// Service define:
// rpc searchProducts(google.protobuf.StringValue) returns (stream Product);
func (w *wrappedStream) RecvMsg(m interface{}) error {
    log.Printf("%T, %v", m, m)
    return w.ServerStream.RecvMsg(m)
}
// Log print:
// *wrapperspb.StringValue, 
It can print the message type using %T correctly, but the message value printing by %v is just a blank.
I'm sure that Server received the right message, because it replied Client the right thing.
The interceptor wrapper RecvMsg is not working in Client too.
答案1
得分: 1
w.ServerStream.RecvMsg(m)将数据解组到m中,只需将打印语句移到RecvMsg()调用之后。
func (w *wrappedStream) RecvMsg(m interface{}) error {
    err := w.ServerStream.RecvMsg(m)
    return err
}
log.Printf("%T, %v", m, m)
请注意,我已经将代码中的打印语句移动到了RecvMsg()调用之后。
英文:
w.ServerStream.RecvMsg(m) will unmarshall data into m, just move print after RecvMsg() call.
func (w *wrappedStream) RecvMsg(m interface{}) error {
    err := w.ServerStream.RecvMsg(m)
    log.Printf("%T, %v", m, m)
    return err
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论