【问题标题】:how to return list of result from grpc mongoose nodejs?如何从 grpc mongoose nodejs 返回结果列表?
【发布时间】:2018-09-20 18:10:36
【问题描述】:

如何使用grpc nodejs返回待办事项列表,结果为空:

但是,当我在没有 grpc 的情况下尝试它时,它会返回带有数据的列表,但是当我尝试使用 grpc 获取待办事项列表时,它会返回空结果 { todo: [] } 注意:其他功能,如插入更新删除 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;
}

【问题讨论】:

  • 你的测试代码输出什么?如果没有看到该函数的结果,很难判断发生了什么。包含.proto 文件的内容可能也有助于弄清楚我们希望序列化代码对您拥有的对象做什么。
  • 使用 .proto 文件更新问题我正在尝试获取待办事项列表。其他功能,如插入更新删除 ReadOne 工作顺利。只是没有使用 grpc 获取所有待办事项列表。只需使用 grpc { todo: [] } ..... 但是没有 grpc 我可以获取数据库中所有待办事项的列表

标签: node.js grpc grpc-node grpc-web


【解决方案1】:

这里的问题是您的 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});
    }
  }
}

【讨论】:

  • 它说得通但不完全,可能是因为我也是Nodejs的新手,你能举个例子在上面的场景中如何做到这一点。
  • 我添加了一些代码来显示您应该更改的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2011-09-05
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
相关资源
最近更新 更多