gikami
@gikami
web программист

Как реализовать последовательную загрузку файлов с помощью sharp.js?

Есть сайт с которого идет загрузка на сервер 10 изображений.
На бекенде происходит resize обработка изображений и сохранение в webp формате.
Проблема в том, что данное действие работает будто бы параллельно и тем самым перегружая CPU и сервак идет на перезагрузку (pm2).
Как можно реализовать последовательную обработку и сохранение файлов не перегружая весь сервак?
Вот код который отвечает за обработку.
Возможно я написал не очень то красиво) Но я не понимаю как такое реализовывать с sharp.
const saveFile = async ({ file, folder }) => {
  try {
    if (!folder) {
      throw "Не указана папка";
    }
    if (!file) {
      throw "Нет файла";
    }

    if (!existsSync("./static/" + folder)) {
      mkdirSync("./static/" + folder, { recursive: true });
    }

    let image = Buffer.from(file?.buffer ?? file, "binary");
    let fileName = uuid.v4() + ".webp";

    return sharp(image)
      .metadata()
      .then((metadata) => {
        return sharp(image)
          .resize({
            fit: sharp.fit.contain,
            width: 1500,
          })
          .webp()
          .toFile("./static/" + folder + "/" + fileName)
          .then(() => {
            return {
              fileName,
              width: metadata.width,
              height: metadata.height,
              size: metadata.size,
            };
            //На выходе я получаю информацию о размерах и сохраняю в базу.
          });
      });
  } catch (err) {
    console.error(err);
    return err;
  }
};

Код который проходит по файлам:
req.files.forEach(async (e) => {
        await saveFile({
          file: e,
          folder: "product",
          mini: false,
        }).then(
          async (metadata) =>
            metadata &&
            (await Media.create({
              media: metadata.fileName,
              options: {
                width: metadata.width ?? 0,
                height: metadata.height ?? 0,
                size: metadata.size ?? 0,
              },
              status: 1,
              productId: data.productId,
            }))
        );
      });
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
  1. Файл сохраняется на диск
  2. В очередь кладется задача на обработку файла
  3. Из очереди по одной забирается задача
  4. Задача выполняется
  5. Результат сохраняется на диск
  6. Файл отдается клиенту

Можно добавить еще две очереди - очередь, которая получает файлы с клиента, а так же очередь, которая отдает файлы клиенту.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы