Как вернуть список результатов из grpc mongoose nodejs?
Как я могу вернуть список задач, используя grpc nodejs, результат пуст:
Однако, когда я пытаюсь сделать это без grpc, он возвращает список с данными, но когда я пытаюсь получить список задач с grpc, он возвращает пустой результат. { todo: [] }
Примечание: другие функции, такие как Insert Update, Delete ReadOne, работают без сбоев. Только не получает список всех Todos
Рабочий код без gRPC приведен в последнем
Вот мой сервер gRPC
const PROTO_PATH = __dirname + '../../../protos/todo.proto';
const grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, oneofs: true });
var todoproto = grpc.loadPackageDefinition(packageDefinition).todoproto;
const server = new grpc.Server();
server.addService(todoproto.TodoService.service, {
list: function (_, callback) {
TodoDb.list(callback);
},
});
// gRPC Server
server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
console.log('grpc server starting on :', '0.0.0.0:50051');
server.start();
console.log('grpc server running on :', '0.0.0.0:50051');
Вот мой клиент gRPC
const PROTO_PATH = __dirname + '../../../../protos/todo.proto';
const grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
PROTO_PATH, {
keepCase: true, enums: String, defaults: true, arrays: true, objects: true, oneofs: true
});
var todoproto = grpc.loadPackageDefinition(packageDefinition).todoproto;
// The protoDescriptor object has the full package hierarchy
var client = new todoproto.TodoService('0.0.0.0:50051', grpc.credentials.createInsecure());
try {
client.list({}, (error, todo) => {
console.log(todo);
if (todo) { console.log('Passed.') }
});
} catch (error) {
console.log(error.message);
}
var command = process.argv.shift();
if (command == 'list')
todosList();
Рабочий тестовый код
var assert = {
list: function (_, callback) {
TodoDb.list(callback);
},
};
try {
assert.list({}, (error, todo) => {
console.log(todo);
if (todo) { console.log('Passed.') }S
});
} catch (error) {
console.log(error.message);
}
Код теста вне
[ { done: false,
createdate: 2018-09-16T14:46:43.855Z,
id: 6,
title: 'Todo App',
description: 'Complete project Before 22 September' },
{ done: false,
createdate: 2018-09-16T14:46:43.855Z,
id: 7,
title: 'Todo App',
description: 'Complete project Before 22 September' },
{ done: false,
createdate: 2018-09-16T14:46:43.855Z,
id: 5,
title: 'Todo App',
description: 'Complete project Before 22 September' } ]
Passed.
Файл.Proto
syntax = "proto3"; //Using proto3 version.
package todoproto;
service TodoService {
rpc List (Empty) returns (TodoList){}
rpc Insert (Todo) returns (Empty){}
rpc Get (TodoId) returns (Todo){}
rpc Update (Todo) returns (Todo){}
rpc Delete (TodoId) returns (Empty){}
}
message Empty {}
message Todo {
int32 id = 1;
string title = 2;
string description = 3;
}
message TodoList {
repeated Todo todo = 1;
}
message TodoId {
int32 id = 1;
}
1 ответ
Проблема здесь в том, что ваш TodoDb.list
функция выводит список Todo
объектов, но API gRPC, который вы используете, ожидает TodoList
объект, который является объектом с ключом todo
сопоставление с этим списком. Итак, вам нужно добавить свой собственный обратный вызов, который помещает список в подобный объект.
В коде вашего сервера list
функция должна выглядеть так:
function(_, callback) {
TodoDb.list(function(error, todoList) {
if (error) {
callback(error);
} else {
// Wrap the list in an object to match TodoList message structure
callback(null, {todo: todoList});
}
}
}