我正在研究节点运行时上的gRPC服务器-客户端编程。
我在客户端流rpc中遇到错误。请参阅以下rpc方法签名。
TreeModelFilter
我想将文件从客户端上传到服务器。所以我定义了客户端流rpc。
问题在于文件上传将仅是第一次成功。
当我尝试上传另一个文件时,出现错误。 在错误结束后写入。
我认为我不能很好地处理信息流。谁能帮忙为什么会这样?谢谢!
service RouteGuide{
rpc DataStreaming(stream File) returns (Stats) {}
}
message Stats{
string msg=1;
}
message File{
bytes chk=1;
}
=============
// server.js
"use strict";
const grpc = require("grpc");
const protoLoader = require("@grpc/proto-loader");
const path = require("path");
const fs = require("fs");
const stream = require("stream");
const PROTO_PATH = path.join(__dirname, "proto", "route.proto"); // path.resolve("proto", "route.proto")
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
keepCase: false,
longs: String,
enums: String,
defaults: true,
oneofs: true
});
const routeguide = grpc.loadPackageDefinition(packageDefinition).routeguide;
const myTransformStream = new stream.Transform({
objectMode: true,
transform(data, enc, cb) {
cb(null, data.chk.toString());
}
});
function dataStreaming(strm, cb) {
console.log("server : streaming function");
stream.pipeline(
strm,
myTransformStream,
fs.createWriteStream("output.txt"),
err => {
if (err) {
console.log(`server side error : ${err}`);
cb(err);
} else {
console.log("server side no error");
cb(null, "server side finish");
}
}
);
}
function getServer() {
const server = new grpc.Server();
server.addService(routeguide.RouteGuide.service, {
DataStreaming: dataStreaming
});
return server;
}
if (require.main === module) {
const routeServer = getServer();
routeServer.bind("localhost:3333", grpc.ServerCredentials.createInsecure());
routeServer.start();
}
答案 0 :(得分:0)
我解决了我的问题。有一些问题。我会解释的。
server.js中的全局变量myTransformStream
是问题所在。我将代码移至dataStreaming
函数中。
我还更改了关闭,销毁选项。
详细来说,我在autoclose
,emitclose
中打开了fs.createReadStream()
,fs.createWriteStream()
选项
然后...在转换流(emitclose
和autodestroy
)中打开了myTransformStream
,myTransform
选项