node.js - 回调值获取“错误”:“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 函数的标准,gRPC 方法处理程序回调将错误作为第一个参数,将成功对象作为第二个对象。在您的代码中的每种情况下,您都传递了一个非空的第一个参数,因此这被解释为错误并作为非 OK 状态发送给客户端。
如果要发送错误,则应传递details
属性设置为字符串的对象,或Error
使用错误详细信息字符串构造的对象。在任何一种情况下,您都可以code
使用 from 的值设置属性grpc.status
,并metadata
使用Metadata
对象设置属性以将这些内容作为错误状态的一部分发送。然后在客户端上,您将收到一个Error
描述错误的对象。它将具有相应的code
和metadata
属性,以及details
带有原始详细信息消息的属性。该message
属性将包含代码、详细信息和代码名称。在您描述的情况下,代码为 number 2
,UNKNOWN
如果未明确设置代码,则为默认值。
如果你只想发送一条消息,你应该将它作为第二个参数传递给回调。
推荐阅读
- mysql - 如何在 docker-compose 文件中为具有不同 mysqld 版本的不同项目组织 mysql 卷?
- powershell - Powershell:您不能调用空值表达式
- android - 在 WebView 中运行远程 Web 应用程序的原生 iOS 和 Android 应用程序
- mysql - 将秒显示为 ddd:hh:mm:ss (MySQL & jsp)
- angular - 强制刷新角度以进行打印
- arrays - 如何获取对数组中对象的引用
- angular - mat-form-field 必须包含一个 MatFormFieldControl。在 getMatFormFieldMissingControlError
- java - JavaFX - 将来自两个来源的数据库信息添加到 TableView (MVC) 中的更好方法
- html - 如何使元素表现得像表格对齐
- reactjs - ReatcJS:在 IE11 中使用 VX 库?