Потоковый файл через SFTP соединение с клиентом - PullRequest
0 голосов
/ 04 апреля 2019

Я пишу сервер Node Express, который подключается через sftp к хранилищу файлов.Я использую пакет ssh2-sftp-client .

Для извлечения файлов он имеет функцию get со следующей подписью:

get(srcPath, dst, options)

Аргумент dst должен быть либо строкой, либо a writable stream, which will be used as the destination for a stream pipe.

Я бы хотел избежать создания файлового объекта на моем сервере и вместо этого перенести файл на мой клиент для экономии памяти, как описано в этой статье .Я попытался выполнить это с помощью следующего кода:

const get = (writeStream) => {
    sftp.connect(config).then(() => {
        return sftp.get('path/to/file.zip', writeStream)
    });
};

app.get('/thefile', (req, res) => {
    get(res); // pass the res writable stream to sftp.get   
});

Однако это приводит к сбою сервера моего узла из-за необработанного отклонения обещания.Возможно ли то, что я пытаюсь сделать?Должен ли я сохранить файл на моем сервере перед отправкой клиенту?Я проверил документацию / примеры для рассматриваемого пакета sftp, но не могу найти пример того, что я ищу.

1 Ответ

0 голосов
/ 05 апреля 2019

Я нашел ошибку, и она глупая с моей стороны. Я забыл прекратить соединение sftp. Когда этот метод был вызван во второй раз, он вызывал исключение при попытке подключения снова. Если кто-то окажется в той же ситуации, не забудьте завершить соединение, как только закончите с ним, как показано ниже:

const get = (writeStream) => {
    sftp.connect(config).then(() => {
        return sftp.get('path/to/file.zip', writeStream);
    }).then(response => {
      sftp.end();
      resolve(response);
    });

};
...