回调值获取“错误”:“ 2未知:具有预期值

时间:2019-04-08 19:48:52

标签: node.js protocol-buffers grpc

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

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

以下是来源: 原始

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

authentication.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结果)上,我得到相同的消息。 我不知道为什么。

1 个答案:

答案 0 :(得分:0)

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

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

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