【发布时间】: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