как вернуть список результатов из grpc mongoose nodejs? - PullRequest
0 голосов
/ 20 сентября 2018

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

Однако, когда я пытаюсь сделать это без grpc, он возвращает список с данными, но когда я пытаюсь получить список задачс grpc он возвращает пустой результат { todo: [] } Примечание : другие функции, такие как Вставить обновление Удалить 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 File

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 Ответ

0 голосов
/ 21 сентября 2018

Проблема здесь в том, что ваша функция TodoDb.list выводит список объектов Todo, но используемый вами gRPC API ожидает объект 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});
    }
  }
}
...