Javascript gRPC客户端流式rpc管道错误。(结束后写入错误)
我正在学习节点运行时上的gRPC服务器客户端编程 我在客户端流式rpc中遇到错误。请参阅以下rpc方法签名Javascript gRPC客户端流式rpc管道错误。(结束后写入错误),javascript,node.js,grpc,node-streams,grpc-node,Javascript,Node.js,Grpc,Node Streams,Grpc Node,我正在学习节点运行时上的gRPC服务器客户端编程 我在客户端流式rpc中遇到错误。请参阅以下rpc方法签名 服务路由指南{ rpc数据流(流文件)返回(Stats){} } 消息统计信息{ 字符串msg=1; } 消息文件{ 字节chk=1; } 我想把文件从客户端上传到服务器。所以我定义了客户端流式rpc 问题是文件上传只会第一次成功 当我试图上传另一个文件时,我得到了一个错误结束后写入错误。 我想我没有很好地处理这件事。有人能解释为什么会发生这种情况吗?谢谢 //server.js “严格
服务路由指南{
rpc数据流(流文件)返回(Stats){}
}
消息统计信息{
字符串msg=1;
}
消息文件{
字节chk=1;
}
我想把文件从客户端上传到服务器。所以我定义了客户端流式rpc
问题是文件上传只会第一次成功
当我试图上传另一个文件时,我得到了一个错误结束后写入错误。
我想我没有很好地处理这件事。有人能解释为什么会发生这种情况吗?谢谢
//server.js
“严格使用”;
const grpc=要求(“grpc”);
const protoLoader=require(@grpc/protoLoader”);
常量路径=要求(“路径”);
常数fs=要求(“fs”);
常量流=需要(“流”);
const PROTO_PATH=PATH.join(u dirname,“PROTO”,“route.PROTO”);//解析路径(“proto”,“route.proto”)
const packageDefinition=protoLoader.loadSync(PROTO_路径{
keepCase:false,
长:字符串,
枚举:字符串,
默认值:true,
真的吗
});
const routeguide=grpc.loadPackageDefinition(packageDefinition).routeguide;
const myTransformStream=新的stream.Transform({
objectMode:true,
转换(数据、enc、cb){
cb(null,data.chk.toString());
}
});
函数数据流(strm、cb){
log(“服务器:流媒体功能”);
流水线(
strm,
Mystream,
fs.createWriteStream(“output.txt”),
错误=>{
如果(错误){
log(`服务器端错误:${err}`);
cb(err);
}否则{
log(“服务器端无错误”);
cb(空,“服务器端完成”);
}
}
);
}
函数getServer(){
const server=new grpc.server();
server.addService(routeguide.routeguide.service{
数据流:数据流
});
返回服务器;
}
if(require.main==模块){
const routeServer=getServer();
routeServer.bind(“localhost:3333”,grpc.ServerCredentials.createUnsecure());
routeServer.start();
}
=============
//client.js
“严格使用”;
const grpc=要求(“grpc”);
const protoLoader=require(@grpc/protoLoader”);
常量路径=要求(“路径”);
常数fs=要求(“fs”);
常量流=需要(“流”);
const PROTO_PATH=PATH.join(u dirname,“PROTO”,“route.PROTO”);//解析路径(“proto”,“route.proto”)
const packageDefinition=protoLoader.loadSync(PROTO_路径{
keepCase:false,
长:字符串,
枚举:字符串,
默认值:true,
真的吗
});
const routeguide=grpc.loadPackageDefinition(packageDefinition).routeguide;
const client=new routeguide.routeguide(
“本地主机:3333”,
grpc.credentials.createUnsecure()
);
const MyTransform=新的stream.Transform({
objectMode:true,
变换(chk、enc、cb){
cb(null,{chk:chk});
}
});
函数runDataStreaming(){
log(“内部run-data-streaming()”;
const strm=client.dataStreaming((err,ret)=>{
如果(错误){
log(“客户端:文件传输失败”);
控制台日志(err);
}否则{
log(“客户端:文件传输成功”);
}
});
stream.pipeline(fs.createReadStream(“test.txt”)、MyTransform、strm、err=>{
如果(错误){
控制台日志(错误消息);
}否则{
console.log(“管道成功”);
}
});
}
if(require.main==模块){
runDataStreaming();
}
我解决了我的问题。有一些问题。我会解释的
myTransformStream
。我将代码移动到dataStreaming
函数中fs.createReadStream()
,fs.createWriteStream()中打开了autoclose
,emitclose
选项
而且。。。打开转换流中的emitclose
,autodestroy
选项(myTransformStream
和myTransform
)
你能在问题中包含原始错误日志吗?