我创建了一个简单的GRPC服务器和客户端。
我想要做的是在服务器中创建自定义错误并将其传递给客户端。我的代码如下:
Server.js
awk '$1 == "commit" {$2 = "https://github.com/account/repo/commit/" $2} 1'
Client.js
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();
当我运行cient时,每个人的结果都是这样的
服务器。
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;
}
客户。
[ 'stack', 'message', 'newStatus', 'newMessage' ]
{ [Error: MY_ERROR] newStatus: 401, newMessage: 'custom unAutorized error' }
因此,我创建的自定义javascript错误[ 'stack', 'message', 'code', 'metadata' ]
{ [Error: MY_ERROR] code: 2, metadata: Metadata { _internal_repr: {} } }
属性已被删除,并且已转换为GRPC标准错误消息。
我的问题是
newStatus, newMessage
。但我也不知道该怎么做。 答案 0 :(得分:2)
gRPC Google Group对此同一问题的答复很有帮助: https://groups.google.com/d/msg/grpc-io/X_bUx3T8S7s/x38FU429CgAJ
您可以使用错误向客户端发送自定义状态消息 对象的消息属性。在你的例子中,那是" MY_ERROR"。该 状态代码应该在"代码"财产,就像你怎么看 在客户端。
如果要使用gRPC状态结构而不是JavaScript 错误,您可以通过填充"代码"财产和 "消息"或"详细信息"对象的属性。
如果要发送元数据,则应构建一个实例 grpc.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' ] } }
答案 1 :(得分:1)
1.是2.Maybe
避免通过线路发送特殊对象(如new Error
)。发送带有error属性的简单对象,并在另一端查找其值。请参阅http://json.org/,了解易于转让的数据。
function sayHello(call, callback) {
try {
var myCustomError = {};
myCustomError.newStatus = 401;
myCustomError.newMessage = 'custom unAuthorized error';
console.log(Object.getOwnPropertyNames(myCustomError ));
console.log(myCustomError);
callback(null, {error: myCustomError, message: ""});
} catch(e) {
callback(e);
}
}
在Client.js
中client.sayHello({name: user}, function(err, response) {
var myCustomError= response.error;
if (myCustomError) {
console.log(Object.getOwnPropertyNames(myCustomError));
console.log(myCustomError);
}
});