Есть сайт с которого идет загрузка на сервер 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,
}))
);
});