gRPC客户端流式RPC管道错误。(在结束ERROR后写入)

时间:2020-01-12 13:32:28

标签: javascript node.js grpc node-streams grpc-node

我正在研究节点运行时上的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();
}

1 个答案:

答案 0 :(得分:0)

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

  1. server.js中的全局变量myTransformStream是问题所在。我将代码移至dataStreaming函数中。

  2. 我还更改了关闭,销毁选项。 详细来说,我在autocloseemitclose中打开了fs.createReadStream()fs.createWriteStream()选项 然后...在转换流(emitcloseautodestroy)中打开了myTransformStreammyTransform选项