#javascript #node.js #grpc #grpc-node
Вопрос:
У меня есть простой gRPC-сервер и клиент. Сервер и клиент работают нормально (я предполагаю, что, поскольку я получаю ответ и без ошибок). Однако ответ пуст, и я понятия не имею, почему.
Вот прото message.proto
syntax = "proto3";
message Msg {
int32 timeStamp = 1;
string text = 2;
string sender = 3;
}
message Empty {}
service MsgService{
rpc AllMessages (Empty) returns (MsgList) {}
}
message MsgList {
repeated Msg msgs = 1;
}
и server.js
const grpc = require('@grpc/grpc-js');
const PROTO_PATH = "./message.proto";
const protoLoader = require('@grpc/proto-loader');
const options = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
const packageDefinition = protoLoader.loadSync(PROTO_PATH, options);
const msgProto = grpc.loadPackageDefinition(packageDefinition);
const server = new grpc.Server();
let savedMessages = [
{ timeStamp: 1, text: "lorem", sender: "alex" },
{ timeStamp: 2, text: "ipsum", sender: "bob" },
{ timeStamp: 3, text: "dolor", sender: "alex" },
{ timeStamp: 4, text: "net", sender: "bob" }
];
server.addService(msgProto.MsgService.service, {
AllMessages: (_, callback) => {
callback(null, savedMessages);
}
})
server.bindAsync("127.0.0.1:50051", grpc.ServerCredentials.createInsecure(), (err, port) => {
if (err) {
console.log(err);
}
console.log(port);
server.start();
console.log("Server running at 127.0.0.1:50051");
})
и client.js
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const PROTO_PATH = "./message.proto";
const options = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
var packageDefinition = protoLoader.loadSync(PROTO_PATH, options);
const MsgService = grpc.loadPackageDefinition(packageDefinition).MsgService;
const client = new MsgService(
"localhost:50051",
grpc.credentials.createInsecure()
);
client.AllMessages({}, (err, msg) => {
// console.log(err);
if (err) throw err;
console.log(msg);
// console.log(msg);
})
и отпор, который я получаю
{ msgs: [] }
Если это поможет , я следил за этим сообщением в блоге https://daily.dev/blog/build-a-grpc-service-in-nodejs
Заранее спасибо.
Ответ №1:
Ваше MsgList
определение сообщения-это сообщение с одним называемым полем msgs
, которое имеет тип repeated Msg
. Объект, который вы отправляете, должен иметь такую форму. Таким образом, это должен быть объект с одним вызванным полем msgs
, который содержит массив объектов, соответствующих формату определения Msg
сообщения. Ваша savedMessages
переменная-это не так, это просто массив, поэтому ее отправка не дает желаемого результата.
Комментарии:
1. Спасибо. Теперь это работает нормально. Возможно, в этом блоге есть какие-то ошибки или что-то изменилось.
2. Да, это ошибка в том сообщении в блоге.