Проблемы с Node Asyn c - PullRequest
0 голосов
/ 26 мая 2020

В следующем коде я использую узел для ответа на запрос POST для изображений, которые я разместил в базе данных. Я пытаюсь l oop через несколько источников, получить URL-адреса изображений и ответить заполненным массивом URL-адресов изображений.

  // Get pictures on current tag
  getTagPhotos = (req) => {
    let FileList = [];

    fs.readdir(
      `/psi-storage/tag-photos/${req.body.ENT}/${req.body.TagNo}/`,
      function (err, files) {
        if (err) {
          throw err;
        }

        for (let j = 0; j < files.length; j++) {
          FileList.push(
            `url/assets/tag-photos/${req.body.ENT}/${req.body.TagNo}/${files[j]}`
          );
          console.log("1");
        }
      }
    );

    // Get pictures on restock tags
    for (let i = 0; i < req.body.RstkTags.length; i++) {
      if (
        fs.existsSync(
          decodeURI(
            `/psi-storage/tag-photos/${req.body.ENT}/${req.body.RstkTags[i].number}/`
          )
        )
      ) {
        fs.readdir(
          `/psi-storage/tag-photos/${req.body.ENT}/${req.body.RstkTags[i].number}/`,
          function (err, files) {
            if (err) {
              throw err;
            }

            for (let j = 0; j < files.length; j++) {
              FileList.push(
                `url/assets/tag-photos/${req.body.ENT}/${req.body.RstkTags[i].number}/${files[j]}`
              );
              console.log("2");
            }
          }
        );
      }
    }

    return FileList;
  };

  // Do nothing if entity storage file is not found
  if (!fs.existsSync(decodeURI(`/psi-storage/tag-photos/${req.body.ENT}/`))) {
    throw "No Entity Photos";
  }

  if (
    fs.existsSync(
      decodeURI(`/psi-storage/tag-photos/${req.body.ENT}/${req.body.TagNo}/`)
    )
  ) {
    let FileList = await getTagPhotos(req);

    console.log("3");
    console.log(FileList);

    try {
      res.status(200).json({
        FileList,
        success: true,
      });
    } catch (error) {
      res.status(200).json({
        error: error,
        success: false,
      });
    }
  }
});

У меня есть console.logs в том порядке, в котором я ожидаю, и мне нужно, чтобы код запускался для успешного выполнения, однако результат будет следующим:

3
[]
1
2

I Мне бы очень понравилось руководство о том, как заставить мою программу на самом деле ждать завершения цикла sh.

1 Ответ

0 голосов
/ 26 мая 2020

Вы не ожидаете своих асинхронных операций. Node теперь имеет Promise версии своих fs API , поэтому сделать это проще, чем когда-либо:

const { promises: fs } = require('fs');

async function getTagPhotos(req) {
  let FileList = [];

  const files = await fs.readdir(`/psi-storage/tag-photos/${req.body.ENT}/${req.body.TagNo}/`);
  const fileList = files.map(file => `url/assets/tag-photos/${req.body.ENT}/${req.body.TagNo}/${files[j]}`);

  // etc...
}
...