【问题标题】:Pipe data from Writable to Readable管道数据从可写到可读
【发布时间】:2020-05-23 02:16:49
【问题描述】:

我正在从 SFTP 服务器获取文件,并使用他们的 sdk 将数据传送到 Box.com。 Box sdk 将可读流作为上传文件的参数。我为从 sftp 服务器获取文件而编写的代码使用了 npm 模块 ssh2-sftp-client

我遇到的问题是,可写流是流的“行尾”,除非您使用像 Transform 这样的东西,它是一个 Duplex 并实现了读写。下面是我正在使用的代码。因为我正在为客户做这件事,所以我故意遗漏了一些不必要的东西。

下面是sftp类上的方法

async getFile(filepath: string): Promise<Readable> {
  logger.info(`Fetching file: ${filepath}`);
  const writable = new Writable();
  const stream = new PassThrough();
  await this.client.get(filepath, writable);
  return writable.pipe(stream);
}

获取文件并尝试通过管道传输到授权 BoxSDK 客户端实例的盒子的实现。

try {
  for (const filename of filenames) {
    const stream: Readable = await tmsClient.getFile(
      'redacted' + filename,
    );

    logger.info(`Piping ${filename} to Box...`);
    await box.createFile(filename, 'redacted', stream);
    logger.info(`${filename} successfully downloaded`);
  }
} catch (error) {
  logger.error(`Failed to move files: ${error}`);
}

我不是非常精通流,但根据我的研究,我认为这在理论上应该可行。

我也尝试过这种实现,其中 ssh 客户端返回一个缓冲区,然后我尝试将该缓冲区作为可读流进行管道传输。有了这个实现,虽然我不断收到来自 Box sdk 的错误,即流意外结束。

async getFile(filepath: string): Promise<Readable> {
  logger.info(`Fetching file: ${filepath}`);
  const stream = new Readable();
  const buffer = (await this.client.get(filepath)) as Buffer;
  stream._read = (): void => {
    stream.push(buffer);
    stream.push(null);
  };
  return stream;
}

还有错误信息:2020-02-06 15:24:57 error: Failed to move files: Error: Unexpected API Response [400 Bad Request] bad_request - Stream ended unexpectedly

非常感谢任何见解!

【问题讨论】:

    标签: node.js typescript stream


    【解决方案1】:

    因此,在对此进行了更多研究之后,事实证明问题实际上出在 Node.js 的 Box sdk 上。 sdk 在实际完成之前终止流的主体。这是因为他们在后台使用request 库,该库需要content-length 标头来发送大型有效负载。如果没有它,它将在发送有效负载之前继续终止流。

    在 Box 社区论坛上,他们建议向流原型添加属性以将内容传递到底层请求库。我强烈不同意这一点,因为这不是正确的做法。 Box sdk 需要提供一种以字节为单位传递内容长度的方法。作为他们 API 的用户,我不应该操纵他们的底层依赖关系。我将使用他们的 sdk 打开一个问题,并希望能解决这个问题。

    希望这对其他人有用!

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2021-03-03
      • 2017-08-25
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多