как вернуть список результатов из grpc mongoose nodejs?

Как я могу вернуть список задач с помощью grpc nodejs, результат пустой:

Однако, когда я пытаюсь это сделать без grpc, он возвращает список с данными, но когда я пытаюсь получить список задач с помощью grpc, он возвращает пустой результат { todo: [] } Примечание: другие функции, такие как Insert Update Delete ReadOne, работают без сбоев . Только не получается список всех задач

Рабочий код без 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;
}

person Zayn Korai    schedule 20.09.2018    source источник
comment
Что выводит ваш тестовый код? Трудно сказать, что происходит, не видя результата этой функции. Вероятно, было бы также полезно включить содержимое файла .proto, чтобы выяснить, что мы ожидаем, что код сериализации сделает с вашим объектом.   -  person murgatroid99    schedule 20.09.2018
comment
обновлено Вопрос с файлом .proto Я пытаюсь получить список задач. другие функции, такие как Insert Update Delete ReadOne, работают без сбоев. Только не получить список всех задач с помощью grpc. Просто получаю этот вывод с помощью grpc { todo: [] } ..... Но без grpc я могу получить список всех задач в db   -  person Zayn Korai    schedule 20.09.2018


Ответы (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});
    }
  }
}
person murgatroid99    schedule 21.09.2018
comment
Это имеет смысл, но не полностью, может быть, из-за того, что я новичок в Nodejs, можете ли вы привести пример, как это сделать в приведенном выше сценарии. - person Zayn Korai; 21.09.2018
comment
Я добавил некоторый код, который показывает, что вы должны изменить - person murgatroid99; 21.09.2018