我创建了一个小型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结果)上,我得到相同的消息。 我不知道为什么。
答案 0 :(得分:0)
与Node函数一样,gRPC方法处理程序回调将错误作为第一个参数,将成功对象作为第二个对象。在代码的每种情况下,您都将传递一个非空的第一个参数,因此该参数将被解释为错误并以非OK状态发送给客户端。
如果要发送错误,则应传递将details
属性设置为字符串的对象,或通过错误详细信息字符串构造的Error
对象。无论哪种情况,您都可以将code
属性设置为grpc.status
中的值,并将metadata
属性设置为Metadata
对象,以将这些内容作为错误状态的一部分发送。然后,在客户端上,您将收到描述错误的Error
对象。它将具有相应的code
和metadata
属性,以及带有原始详细信息的details
属性。 message
属性将包含代码,详细信息和代码名称。在您描述的情况下,代码为数字2
,UNKNOWN
,如果未明确设置代码,则为默认值。
如果只想发送一条消息,则应将其作为第二个参数传递给回调。