Неизвестная ошибка gRPC без сообщения об ошибке - gRPC-web и goproxy
Я пытаюсь создать веб-приложение со следующим стеком:
- Флаттер / Дротик
- Go / goproxy
- gRPC
- MongoDB
Мне удалось успешно определить и скомпилировать protobuf в Dart and 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 %v\n%v\n", port, err)
}
repositories.ConnectToMongoDB()
grpcServer = grpc.NewServer()
registerServices()
grpcWebServer := grpcweb.WrapServer(grpcServer)
httpServer := &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 := &services.CardsService{}
protos.RegisterCardsServiceServer(grpcServer, cardsService)
filtersService := &services.FiltersService{}
protos.RegisterFiltersServiceServer(grpcServer, filtersService)
}
Я могу сказать, что сервер правильно принимает запрос, и когда я выводю ответ службы, я получаю ожидаемый ответ.
Вот служба, в которую я звоню:
func (service *FiltersService) GetFilters(ctx context.Context, void *protos.Void) (*protos.Filters, error) {
filters := repositories.GetFilters()
return converters.FiltersStructToFiltersProtoConverter(filters), nil
}
Когда я вывожу ответ
converters.FiltersStructToFiltersProtoConverter(filters)
, Я получаю правильный результат, поэтому похоже, что проблема с настройкой моего сервера все еще существует.
Я знаю, что это не так уж много информации, но я не уверен, какая еще информация вам может понадобиться, но могу добавить по мере необходимости.