Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript gRPC客户端流式rpc管道错误。(结束后写入错误)_Javascript_Node.js_Grpc_Node Streams_Grpc Node - Fatal编程技术网

Javascript gRPC客户端流式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 “严格

我正在学习节点运行时上的gRPC服务器客户端编程

我在客户端流式rpc中遇到错误。请参阅以下rpc方法签名

服务路由指南{
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();
}

我解决了我的问题。有一些问题。我会解释的

  • 问题出在server.js中的全局变量
    myTransformStream
    。我将代码移动到
    dataStreaming
    函数中

  • 我还更改了关闭、销毁选项。 具体来说,我在
    fs.createReadStream()
    fs.createWriteStream()中打开了
    autoclose
    emitclose
    选项 而且。。。打开转换流中的
    emitclose
    autodestroy
    选项(
    myTransformStream
    myTransform


  • 你能在问题中包含原始错误日志吗?