gpt4 book ai didi

javascript - 我可以从服务器向客户端 GRPC 发送自定义错误消息吗?

转载 作者:IT老高 更新时间:2023-10-28 23:08:42 30 4
gpt4 key购买 nike

我创建了一个简单的 GRPC 服务器和客户端。

我想做的是在服务器中创建一个自定义错误并将其传递给客户端。我的代码如下所示:

Server.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();

Client.js

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();

还有我的原型(prototype)文件

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 标准错误消息。

我的问题是

  1. 是否可以向客户发送自定义消息?
  2. 我可以创建 GRPC 错误,而不是 javascript 错误吗?
  3. 我认为向客户端发送自定义属性的一种方法是将自定义数据添加到 Metadata 。但我也不知道该怎么做。

最佳答案

在 gRPC Google Group 上有对同样问题的有用回复: https://groups.google.com/d/msg/grpc-io/X_bUx3T8S7s/x38FU429CgAJ

You can send a custom status message to the client using the Error object's message property. In your example, that is "MY_ERROR". The status code should be in the "code" property, just like how you see it on the client side.

If you want to use the gRPC status structure instead of a JavaScript error, you can do so by populating the "code" property and the "message" or "details" property of the object.

If you want to send metadata, you should construct an instance of the grpc.Metadata class, then add key/value pairs to the resulting object. Then you can pass it as the third argument of the callback or set the error's "metadata" property to send it to the client with the error.

Please note that the status codes that gRPC uses are not HTTP status codes, but gRPC specific codes that are defined in grpc.status. You should only set the error's code property using those codes. If you want to send your own codes, use metadata instead.

我会用一些例子来说明上面写的内容。

要发送带有错误的自定义消息,请使用消息构造 Error。这将设置 message 属性:

var jsErr = new Error('Unauthorized');

如上所述,在您的情况下直接设置 gRPC 状态代码可能没有用。但是,作为引用,可以通过错误的 code 属性设置 gRPC 状态码:

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' ] } }

关于javascript - 我可以从服务器向客户端 GRPC 发送自定义错误消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40777189/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com