首页 > 解决方案 > 回调值获取“错误”:“2未知:具有预期值

问题描述

我创建了一个小型 gRPC 服务器。我会将它用作带有数据库的身份验证服务器。

但是,当我得到回调的值时,我得到"error": "2 UNKNOWN:+ 好消息(“错误的用户名”或“错误的密码”)

这里的来源:proto

syntax = "proto3";

package auth;

service Auth {
  rpc onLogin (LoginRequest) returns (LoginResponse);
}

// The request message containing the username and password.

message LoginRequest {
  string username = 1;
  string password = 2;
}

// The response message containing the JWT token.

message LoginResponse {
  string error = 1;
}

grpc.js

const grpc = require("grpc");
var protoLoader = require('@grpc/proto-loader');
const authentication = require("./authentication")

var PROTO_PATH = __dirname + '/auth.proto';

var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
    });

var authCredentials = grpc.loadPackageDefinition(packageDefinition).auth;

function onLogin(call, callback) 
{
    authentication.grpcLogin(call, callback);
}

module.exports.StartAuthServer = function() {
var server = new grpc.Server();
server.addService(authCredentials.Auth.service, {onLogin: onLogin});
server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure()); 
server.start();
}

身份验证.js

module.exports.grpcLogin = function(call, callback){
    db.query("select * from users where username = ?" , [call.request.username], function(error, rows){
        if (error)
        return callback({message: error});
        if(!rows.length){
          return callback({
              message: "wrong username" //Error here
          });
        }
        var dbpassword = rows[0].password;
        if(sodium.password_check(dbpassword, call.request.password) === false){
            return callback({
                message: "wrong password" //and here
            });
         }
           //console.log(rows[0]);
           return callback({message: JSON.stringify(rows[0])}); //here too
       });
};

在每个回调(错误和 dababase 结果)上,我都会收到相同的消息。我不知道为什么。

标签: node.jsprotocol-buffersgrpc

解决方案


作为 Node 函数的标准,gRPC 方法处理程序回调将错误作为第一个参数,将成功对象作为第二个对象。在您的代码中的每种情况下,您都传递了一个非空的第一个参数,因此这被解释为错误并作为非 OK 状态发送给客户端。

如果要发送错误,则应传递details属性设置为字符串的对象,或Error使用错误详细信息字符串构造的对象。在任何一种情况下,您都可以code使用 from 的值设置属性grpc.status,并metadata使用Metadata对象设置属性以将这些内容作为错误状态的一部分发送。然后在客户端上,您将收到一个Error描述错误的对象。它将具有相应的codemetadata属性,以及details带有原始详细信息消息的属性。该message属性将包含代码、详细信息和代码名称。在您描述的情况下,代码为 number 2UNKNOWN如果未明确设置代码,则为默认值。

如果你只想发送一条消息,你应该将它作为第二个参数传递给回调。


推荐阅读