node.js - GRPC双向流配置
问题描述
我正在按照这个 GRPC 介绍视频在客户端和服务器之间实现一个简单的双向流
可能我在实现中遗漏了一些东西,实际上我收到了这个错误:
错误:14 不可用:收到 GOAWAY
这是我的代码:
- 原型:
syntax = "proto3";
package nbsb;
message EchoMessage {
string value = 1;
int32 value2 = 2;
}
service EchoService {
rpc Echo (EchoMessage) returns (EchoMessage);
rpc EchoClientStream (stream EchoMessage) returns (EchoMessage);
rpc EchoServerStream (EchoMessage) returns (stream EchoMessage);
rpc EchoBidiStream (stream EchoMessage) returns (stream EchoMessage);
}
-服务器
var PROTO_PATH = __dirname + '/echo.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
});
var hello_proto = grpc.loadPackageDefinition(packageDefinition).nbsb;
const { Server } = require('grpc-server-js');
function main() {
const server = new Server();
server.addService(hello_proto.EchoService.service, {
EchoBidiStream(stream){
stream.on('error', console.error);
stream.on('data', (data)=>{stream.write(data)});
stream.on('end',()=>stream.end());
}
});
server.bind('localhost:55555');
}
main();
-客户:
var PROTO_PATH = __dirname + '/echo.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});
var hello_proto = grpc.loadPackageDefinition(packageDefinition).nbsb;
function main() {
var client = new hello_proto.EchoService('localhost:55555',grpc.credentials.createInsecure());
const stream = client.EchoBidiStream();
stream.on('error', console.error);
stream.on('data',console.log);
stream.on('end',()=>client.close());
stream.write({data:{value: "hello", value2:1}});
stream.end({});
}
main()
服务器实现是 grpc-server-js
我错过了什么还是有什么问题?
谢谢您的帮助!
解决方案
您需要server.start()
在成功绑定端口后调用才能真正开始处理请求。server.bind
返回一个承诺,因此您应该使用await
该承诺或使用promise.then
来知道绑定何时成功。
推荐阅读
- javascript - 无法使用 javascript 读取 python 生成的 JSON
- r - 尝试将 2.5 gb csv 文件读入 R 时出错
- python - 用相同的颜色绘制每个集群
- informatica - 支持 Informatica 集成分配步骤中的可选参数
- excel - 配置模块
- html - 可以在 css 文件中设置 contenteditable 吗?
- swift - 如何使用 2 个 Swift 协议创建观察者模式,其中两个关联类型必须相同?
- java - logback-spring.xml 中的 LogstashTcpSocketAppender 不会将日志发送到 ELK 但适用于基于 Java 的方法
- oracle-apex - 交互式报表中的列标题
- excel - 如果命令 Application.run 不应该能够打开工作簿,为什么引用的工作簿打开两次?