Я работаю над получением файлов с SFTP-сервера и передачей данных на Box.com, используя их SDK. Box sdk принимает читаемый поток в качестве параметра для загрузки файла. Код, который я написал для извлечения файлов с сервера sftp, использует модуль npm ssh2-sftp-client
.
У меня проблема в том, что записываемый поток - это «конец строки» с потоками если вы не используете что-то вроде Transform, который является дуплексом и реализует как чтение, так и запись. Ниже приведен код, который я использую. Поскольку я работаю над этим для клиента, я намеренно пропускаю некоторые ненужные вещи.
Ниже приведен метод класса 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}`);
}
Я не очень хорошо разбираюсь в потоках, но, основываясь на моих исследованиях, я думаю, что это должно сработать в теории.
Я также пробовал эту реализацию, где клиент s sh возвращает буфер, а затем я пытаюсь передать этот буфер в виде читаемого потока. В этой реализации я продолжаю получать сообщения от SDK Box о том, что поток неожиданно завершился.
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
.
Любое понимание очень ценится!