Неизвестная ошибка gRPC без сообщения об ошибке — gRPC-web и goproxy

#flutter-web #grpc-go #grpc-web #goproxy

Вопрос:

Я пытаюсь создать веб-приложение со следующим стеком:

  • Флаттер/Дротик
  • Go/goproxy
  • gRPC
  • MongoDB

Мне удалось успешно определить и скомпилировать protobuf в Dart и Go, однако теперь, когда я пытаюсь интегрировать пользовательский интерфейс с серверной частью, я сталкиваюсь со следующей проблемой:

 Error: gRPC Error (code: 2, codeName: UNKNOWN, message:
null, details: [], rawResponse: null, trailers: {})
 

Вот мой клиентский код:

 import 'package:grpc/grpc_web.dart';

import 'package:proj/protos/cards.pb.dart';
import 'package:proj/protos/cards.pbgrpc.dart';

class FiltersService {
  static ResponseFuture<Filters> getFilters() {
    GrpcWebClientChannel channel =
        GrpcWebClientChannel.xhr(Uri.parse('http://localhost:9000'));

    FiltersServiceClient clientStub = FiltersServiceClient(
      channel,
    );

    return clientStub.getFilters(Void());
  }
}
 

Код контроллера сервера:

 const (
    port = 9000
)

var (
    grpcServer *grpc.Server
)


func StartServer() {
    log.Println("Starting server")
    listener, err := net.Listen("tcp", fmt.Sprintf(":%v", port))
    if err != nil {
        log.Fatalf("Unable to listen to port %vn%vn", port, err)
    }

    repositories.ConnectToMongoDB()

    grpcServer = grpc.NewServer()
    registerServices()
    grpcWebServer := grpcweb.WrapServer(grpcServer)

    httpServer := amp;http.Server{
        Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            if r.ProtoMajor == 2 {
                grpcWebServer.ServeHTTP(w, r)
            } else {
                w.Header().Set("Access-Control-Allow-Origin", "*")
                w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
                w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-User-Agent, X-Grpc-Web")
                w.Header().Set("grpc-status", "")
                w.Header().Set("grpc-message", "")
                if grpcWebServer.IsGrpcWebRequest(r) {
                    grpcWebServer.ServeHTTP(w, r)
                }
            }
        }),
    }

    httpServer.Serve(listener)

}

// Register services defined in protobufs to call from UI
func registerServices() {
    cardsService := amp;services.CardsService{}
    protos.RegisterCardsServiceServer(grpcServer, cardsService)

    filtersService := amp;services.FiltersService{}
    protos.RegisterFiltersServiceServer(grpcServer, filtersService)
}
 

I can tell that the server is receiving the request properly, and when I output the response of the service, I am getting the expected response.

Here is the service I am calling:

 func (service *FiltersService) GetFilters(ctx context.Context, void *protos.Void) (*protos.Filters, error) {
    filters := repositories.GetFilters()
    return converters.FiltersStructToFiltersProtoConverter(filters), nil
}
 

Когда я вывожу ответ converters.FiltersStructToFiltersProtoConverter(filters) , я получаю правильный вывод, так что, похоже, все еще существует проблема с настройкой моего сервера.

Я знаю, что это не так много информации для продолжения, однако я не уверен, какая еще информация вам может понадобиться, но могу добавить ее по мере необходимости.