如何在nodejs中返回grpc错误

4nkexdtk  于 2022-11-04  发布在  Node.js
关注(0)|答案(3)|浏览(90)

我想在服务器端返回grpc错误代码和描述。我已经试过了

function sayHello(call, callback) {
  callback({error: {code: 400, message: "invalid input"});
}

但我从客户那里得到了这个例外

{ Error: Unknown Error
    at /home/thanh/email/node_modules/grpc/src/node/src/client.js:434:17 code: 2, metadata: Metadata { _internal_repr: {} } }

如果我想在消息定义中包含这样的错误字段。

message Hello {
  string name = 1;
  string error = 2; // don't want this
}

那么,将grpc错误发送回客户端的正确方法是什么?

nxowjjhe

nxowjjhe1#

将其更改为:

return callback({
  code: 400,
  message: "invalid input",
  status: grpc.status.INTERNAL
})
mrzz3bfm

mrzz3bfm2#

作为补充,GRPC只允许16种错误,你可以从它的站点检查所有错误代码:https://grpc.io/docs/guides/error/#error-status-codes。
在这里我找到了NodeJ错误处理的示例代码:https://github.com/avinassh/grpc-errors/blob/master/node/server.js

1qczuiv0

1qczuiv03#

为了弄清楚@avi和@murgatroid99说了什么,你要做的是像这样构造回调:

import * as grpc from '@grpc/grpc-js';

try{
  somethingThatThrowsAnError();
}catch(e){
  return callback(
    {
      message: e ,
      code: grpc.status.NOT_FOUND
    },
    null,
  )
}

grpc.status.NOT_FOUND只是一个整数5,当客户端从服务器获得错误响应时,您可以从返回的err属性中读取它,例如:

const client = new MyServiceConstructor(
  address,
  grpc.credentials.createInsecure()
);

client.myMethod(
  myRequest,
  metadata ?? new grpc.Metadata(),
  (error: string, response: T_RESPONSE_TYPE) => {
    if (error) {
      if(error.code === grpc.status.NOT_FOUND) {
        return handleNotFound(error, myRequest)
      }

      return unknownError(error, myRequest)
    }

    return response
  },
);

相关问题