如何在Web应用程序中获取自定义的错误有效载荷?

时间:2018-12-28 19:01:27

标签: grpc grpc-java grpc-web

我有以下简单的服务定义:

service Echo {
    rpc echo (In) returns (Out) {}
}

message In {
    string text = 1;
}

message Out {
    string text = 1;
}

message Error {
    int32 status = 1;
}

如您所见,我有一个自定义Error定义。这包含特定于服务的状态代码。服务正在评估给定的文本,如果文本不合适,则返回错误。在我的Java应用程序中,我正在执行以下操作以返回一个Error对象:

import com.google.protobuf.Any;
import com.google.rpc.Code;
import com.google.rpc.Status;

...

final StreamObserver<Out> response = ...; // as given by the library
final Error error = Error.newBuilder().setStatus(55).build(); // this creates a custom Error object, see .proto

response.onError(StatusProto.toStatusRuntimeException(Status.newBuilder()
        .setCode(Code.INVALID_ARGUMENT.getNumber())
        .setMessage("This argument is invalid.")
        .addDetails(Any.pack(error))
        .build()));

我现在的问题是:如何在我的JS应用程序中获得自定义Error负载?

var request = new In();
request.setText('Some text which will be evaluated at the server.');

client.echo(request, {}, (error, response) => {
   // if (55 = error.details.status) { ... }
});

我目前正在使用grpc-web的JS版本,尽管我可能很快会迁移到TS。

1 个答案:

答案 0 :(得分:0)

下面是一个如何在一元RPC中使用error对象的示例:https://github.com/grpc/grpc-web/blob/master/net/grpc/gateway/examples/echo/echoapp.js#L71-L74

简而言之,你

if (err) {
  // console.log(err.code)
  // console.log(err.message)
}