зацикливание внутри SFTP обещает не загружать данные файла в локальный файл? - PullRequest
1 голос
/ 21 февраля 2020

Моя общая проблема: после того, как я отфильтровал файлы, которые были добавлены за последние 5 минут, я зацикливался на возвращенном массиве объектов. Оттуда я добавляю имя удаленного файла root к имени, возвращенному из файлов, добавленных за последние 5 минут. fastget ничего не записывает в мой локальный файл.

Я проверил добавленный маршрут за пределами l oop, и он работает, я по какой-то причине теряю данные моего обещания внутри l oop?

sftp
  .connect({
    host: "hostaddress",
    port: 22,
    username: "USERNAME",
    password: "PASSWORD"
  })
  .then(() => {
    return sftp.list(root);
  })
  .then(data => {
    //filters new files in last 5 min
    const filteredFile = data.filter(file => {
      let currentDate = moment();
      let CurrentTimeMinusFive = moment().subtract(5, "minutes");
      let allAccessTimes = file.accessTime;
      let parsedAccessTimes = moment(allAccessTimes);
      let filteredTime = moment(parsedAccessTimes).isBetween(
        CurrentTimeMinusFive,
        currentDate
      );
      //returns boolean if the file has been added in the last 5 minutes
      return filteredTime;
    });
    //returns full metadata in array of objects
    console.log(filteredFile);

    //not writing filedata from remote server to localfile
    let localPath = "/Users/me/Desktop/DOWNLOADEDSFTP/data.txt";
    filteredFile.forEach(file => {
      let name = file.name;
      return sftp.fastGet(
        `remote-path/${name}`,
        localPath
      );
    });
  })
  .then(() => {
    sftp.end();
  })
  .catch(err => {
    console.error(err.message);
  });

1 Ответ

0 голосов
/ 21 февраля 2020

Вы используете forEach l oop с обещаниями, которые не работают так, как вы ожидаете. Вам нужно использовать for..of или Promise.all, если вы можете делать что-то параллельно.

for(const file of filteredFile) {
      let name = file.name;
      await sftp.fastGet(
        `remote-path/${name}`,
        localPath
      );
    });

Убедитесь, что вы поставили asyn c вот так

.then(async data => {

...