значение обратного вызова get "error": "2 Unknow: с ожидаемым значением - PullRequest
0 голосов
/ 08 апреля 2019

Я создаю маленький сервер 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();
}

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 голосов
/ 09 апреля 2019

Как обычно для функций Node, обратные вызовы обработчика метода gRPC принимают ошибку в качестве первого аргумента и объект успеха в качестве второго объекта. В каждом случае в вашем коде вы передаете ненулевой первый аргумент, поэтому он интерпретируется как ошибка и отправляется клиенту как состояние не OK.

Если вы хотите отправить ошибку, вы должны передать либо объект со свойством details, установленным в строку, либо объект Error, созданный со строкой сведений об ошибке. В любом случае вы можете установить свойство code со значением от grpc.status и свойство metadata с объектом Metadata, чтобы отправлять эти вещи как часть состояния ошибки. Затем на клиенте вы получите объект Error, описывающий ошибку. Он будет иметь соответствующие свойства code и metadata и свойство details с исходным сообщением сведений. Свойство message будет содержать код, детали и название кода. В описываемой вами ситуации это код 2, UNKNOWN, который используется по умолчанию, если код явно не задан.

Если вы хотите просто отправить сообщение, вы должны передать его в качестве второго аргумента для обратного вызова.

...