首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gPRC如何将数组数据从服务器发送到客户端[gPRC + Node.js]

gPRC如何将数组数据从服务器发送到客户端[gPRC + Node.js]
EN

Stack Overflow用户
提问于 2018-12-26 19:55:21
回答 2查看 2.4K关注 0票数 0

我试图将数组数据对象从server.js发送到client.js,但没有定义。

发送此数据类型的正确方法是什么?

代码语言:javascript
复制
- string
- number
- Object
- array

我试图从主服务器向客户端发送一个简单的数组数据。我甚至不想想象发送像对象这样更复杂的数据

有人能给我看一个简单的工作示例吗?我可以从server.js发送这个数据

代码语言:javascript
复制
[
  { id: '1', title: 'Note 1', content: 'Content 1'},
  { id: '2', title: 'Note 2', content: 'Content 2'},
  { id: '3', title: 'Note 3', content: 'Content 3'}
]

在客户端,如果我运行

节点.\client.js

代码语言:javascript
复制
[
  { id: '1', title: 'Note 1', content: 'Content 1'},
  { id: '2', title: 'Note 2', content: 'Content 2'},
  { id: '3', title: 'Note 3', content: 'Content 3'}
]

notes.proto

代码语言:javascript
复制
syntax = "proto3";

package notes;

service NoteService {
    rpc GetNoteList (Empty) returns (NoteList) {}  <--- this not workig
    rpc GetNoteItem (Empty) returns (Note) {} <--- this works
}
message Empty {}

message Note {
    string id = 1;
    string title = 2;
    string content = 3;
}

message NoteList {
    repeated Note notes = 1;
}

server.js

代码语言:javascript
复制
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');

const PROTO_PATH = __dirname + '/../../protos/notes.proto';
// const notesProto = grpc.load('notes.proto')

const packageDefinition = protoLoader.loadSync(
  PROTO_PATH,
  { 
    keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
  }
);

const notesProto = grpc.loadPackageDefinition(packageDefinition).notes;



//  returns a list of notes.
const getNoteList = (call, callback) => {
  // mock data
  const notes = [
    { id: '1', title: 'Note 1', content: 'Content 1'},
    { id: '2', title: 'Note 2', content: 'Content 2'},
    { id: '3', title: 'Note 3', content: 'Content 3'},
  ];
  callback(null, { message: notes });
}


function getNoteItem(call, callback) {
  const data = { id: '1', title: 'Note 1', content: 'Content 1'};
  return callback(null, data)
}

/**
 * Starts an RPC server that receives requests for the Greeter service at the
 * sample server port
 */
function main() {
  var server = new grpc.Server();
  server.addService(notesProto.NoteService.service, {
    GetNoteList: getNoteList,
    GetNoteItem: getNoteItem
  });
  server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
  console.log('Server running at http://127.0.0.1:50051')
  server.start();
}

main();

client.js

代码语言:javascript
复制
// var PROTO_PATH = __dirname + '/../../protos/model.proto';
var PROTO_PATH = __dirname + '/../../protos/notes.proto';


var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
  PROTO_PATH,
  {
    keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
  }
);
const notesProto = grpc.loadPackageDefinition(packageDefinition).notes;

function main() {
  const client = new notesProto.NoteService('localhost:50051', grpc.credentials.createInsecure());
  var user;

  if (process.argv.length >= 3) {
    user = process.argv[2];
  } else {
    user = 'world';
  }

  // console.log({user : user});

    // expected to return array of objects
  client.getNoteList('test', (err, res) => {
    if (!err) {
      console.log('list1: ', res);
      console.log('list2: ', res.message);
    } else {
      console.error(err);
    }
  });


  // get a single item
  client.getNoteItem('test', (err, res) => {
    if (!err) {
      console.log('getNoteItem res: ', res);
    } else {
      console.error(err);
    }
  });


}

main();

输出

代码语言:javascript
复制
PS C:\dev\george\tests\GRPC\grpc-test\server\node> node .\client.js
getNoteItem res:  { id: '1', title: 'Note 1', content: 'Content 1' }
list1:  { notes: [] }
list2:  undefined
EN

回答 2

Stack Overflow用户

发布于 2018-12-26 20:11:39

您试过在每个项目中调用回调吗?

票数 0
EN

Stack Overflow用户

发布于 2018-12-26 21:08:35

我发现,问题是

代码语言:javascript
复制
// returns a list of notes.
const getNoteList = (call, callback) => {

  // mock data
  const data = [
    { id: '1', title: 'Note 1', content: 'Content 1'},
    { id: '2', title: 'Note 2', content: 'Content 2'},
    { id: '3', title: 'Note 3', content: 'Content 3'},
  ];
  callback(null, { notes: data });  <---
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53936523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档