我的Proto文件看起来像这样-
message Todos {
repeated Todo todos = 1;
}
message Todo {
int32 id = 1;
string name = 2;
bool done = 3;
}
当我从服务器发送{todos:[...]}时,它工作正常,但是当直接发送数组时,得到一个空对象{}。
服务器
getAll(_, callback) {
console.log(todos);
return callback(null, { todos });
}
客户
client.getAll({}, function (err, res) {
if (err) {
return console.log(err);
}
console.log('todos: ');
return console.log(res);
});
版本-
答案 0 :(得分:1)
如果我的理解正确,那么仅发送数组todos
而不是发送包含该数组的对象会遇到问题。仅发送数组只是对API的无效使用。 Protobuf服务始终会发送Protobuf消息,因此您必须传递一个实际的消息对象,而不是该对象的单个字段。
答案 1 :(得分:0)
如果使用grpc.load
,则可以发送回一个数组:
callback(null, todos);
如果您使用protoLoader.loadSync
和grpc.loadPackageDefinition
,则需要发回:
callback(null, { todos: todos });
答案 2 :(得分:0)
在我的情况下,我试图返回一个数组,看来您总是必须返回一个对象 ....
hero.proto
syntax = "proto3";
package hero;
service HeroService {
rpc GetHeroById(HeroById) returns (Hero) {}
rpc ListHeroesById(HeroById) returns (HeroList) {}
}
message HeroById {
int32 id = 1;
}
message Hero {
int32 id = 1;
string name = 2;
}
message HeroList {
repeated Hero heroes = 1;
}
hero.controller.ts
@GrpcMethod('HeroService')
listHeroesById(data: HeroById, metadata: any): object {
const items = [
{ id: 1, name: 'John' },
{ id: 2, name: 'Doe' },
{ id: 3, name: 'Billy' },
];
// make sure you return an object, even if you want an array!
return { heroes: items.filter(({ id }) => id === data.id) };
}