シンプルな GRPC サーバーとクライアントを作成しました。
私がやりたいのは、サーバーでカスタム エラーを作成し、それをクライアントに渡すことです。コードは次のようになります。
サーバー
var error = require('error');
var PROTO_PATH = grpc.load(__dirname + '/proto/hello.proto');
var hello_proto = PROTO_PATH.hello;
function sayHello(call, callback) {
try {
var jsErr = new Error('MY_ERROR');
jsErr.newStatus = 401;
jsErr.newMessage = 'custom unAuthorized error';
console.log(Object.getOwnPropertyNames(jsErr));
console.log(jsErr);
callback(jsErr);
} catch(e) {
callback(e);
}
}
function sayHelloAgain(call, callback) {
callback(null, {message: 'Hello Again ' + call.request.name});
}
function main() {
var server = new grpc.Server();
server.addProtoService(hello_proto.Hello.service, {sayHello: sayHello,sayHelloAgain: sayHelloAgain });
server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
server.start();
}
main();
クライアント
var grpc = require('grpc');
var PROTO_PATH = grpc.load(__dirname + '/proto/hello.proto');
var hello_proto = PROTO_PATH.hello;
function main() {
var client = new hello_proto.Hello('localhost:50051',grpc.credentials.createInsecure());
var user;
if (process.argv.length >= 3) {
user = process.argv[2];
} else {
user = 'world';
}
client.sayHello({name: user}, function(err, response) {
console.log(Object.getOwnPropertyNames(err));
console.log(err);
});
}
main();
そして私のプロトファイル
syntax = "proto3";
package hello;
service Hello {
rpc sayHello(sayHelloRequest) returns (sayHelloResponse) {}
rpc sayHelloAgain(sayHelloRequest) returns (sayHelloResponse) {}
}
message sayHelloRequest {
string name = 1;
}
message sayHelloResponse {
string message = 1;
}
cientを実行すると、それぞれの結果は次のようになります
サーバー。
[ 'stack', 'message', 'newStatus', 'newMessage' ]
{ [Error: MY_ERROR] newStatus: 401, newMessage: 'custom unAutorized error' }
クライアント 。
[ 'stack', 'message', 'code', 'metadata' ]
{ [Error: MY_ERROR] code: 2, metadata: Metadata { _internal_repr: {} } }
そのため、作成したカスタム JavaScript エラーのnewStatus, newMessage
プロパティは削除され、GRPC 標準エラー メッセージに変換されました。
私の質問は
- クライアントにカスタムメッセージを送信することは可能ですか?
- JavaScript エラーではなく、GRPC エラーを作成できますか?
- カスタム属性をクライアントに送信する 1 つの方法は、カスタム データを追加することだと思います
Metadata
が、その方法もよくわかりません。
ベストアンサー1
gRPC Google グループには、同じ質問に対する役立つ回答があります。https://groups.google.com/d/msg/grpc-io/X_bUx3T8S7s/x38FU429CgAJ
Error オブジェクトの message プロパティを使用して、カスタム ステータス メッセージをクライアントに送信できます。この例では、これは "MY_ERROR" です。ステータス コードは、クライアント側で表示されるのと同じように、"code" プロパティにある必要があります。
JavaScript エラーの代わりに gRPC ステータス構造を使用する場合は、オブジェクトの「code」プロパティと「message」または「details」プロパティを設定することで実行できます。
メタデータを送信する場合は、grpc.Metadata クラスのインスタンスを作成し、結果のオブジェクトにキーと値のペアを追加する必要があります。その後、それをコールバックの 3 番目の引数として渡すか、エラーの "metadata" プロパティを設定して、エラーとともにクライアントに送信できます。
gRPC が使用するステータス コードは HTTP ステータス コードではなく、grpc.status で定義されている gRPC 固有のコードであることに注意してください。これらのコードを使用してエラーのコード プロパティのみを設定する必要があります。独自のコードを送信する場合は、代わりにメタデータを使用します。
上記の内容をいくつかの例で説明します。
エラーとともにカスタム メッセージを送信するには、Error
メッセージを含む を作成します。これにより、message
プロパティが設定されます。
var jsErr = new Error('Unauthorized');
上で述べたように、あなたのケースでは gRPC ステータス コードを直接設定することはおそらく役に立ちません。ただし、参考までに、gRPC ステータス コードはエラーのcode
プロパティを通じて設定できます。
jsErr.code = grpc.status.PERMISSION_DENIED;
独自のエラー コードやその他の情報を送信するには、メタデータを使用します。
var metadata = new grpc.Metadata();
metadata.set('key1', 'value2');
metadata.set('key2', 'value2');
jsErr.metadata = metadata;
ここで、サーバーが上記のようにエラーを構築し、クライアントが返されたエラーを次のように出力した場合:
console.log(Object.getOwnPropertyNames(err));
console.log(err);
console.log(err.metadata);
クライアント出力は次のようになります。
[ 'stack', 'message', 'code', 'metadata' ]
{ [Error: Unauthorized]
code: 7,
metadata: Metadata { _internal_repr: { key1: [Object], key2: [Object] } } }
Metadata { _internal_repr: { key1: [ 'value2' ], key2: [ 'value2' ] } }