Получение пустого ответа от вызова gRPC

#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. Да, это ошибка в том сообщении в блоге.