Node.js: чтение картинки, которая перезаписывается, ссылается только на исходное изображение

Я в основном перезаписываю overwriteME.jpg внутри

const screenshotDesktop = require('screenshot-desktop')
const sharp = require('sharp');

(async () => {

      while (1 < 5){
        var currentShot = screenshotDesktop.all()
        .then(imgs => {
            return  fs.writeFile(`/Users/ga/proj/overwriteME.jpg`, imgs[0], (err) => {
                    if (err) throw err;
                    crop();
            });
        });
         await delay(1000);

       }
   async function crop(crop){

       // original size from metadata
       var resizedImage = await sharp('/Users/ga/proj/overwriteME.jpg');
       var metadata = await resizedImage.metadata();
       console.log(metadata);
   };

})();


function delay(timeout) {
  return new Promise((resolve) => {
    setTimeout(resolve, timeout);
  });
}

Я ожидал разных метаданных, так как я делаю скриншоты видео, воспроизводимого на экране и перезаписывающего overwriteME.jpg, и использую Sharp для извлечения метаданных.

Фактически произошло то, что возвращались те же метаданные, когда я думал, что Sharp будет отражать изменения файла.

Каким-то образом файл меняется, но, когда его читает диез, он ссылается на ту же старую картинку с самого начала.

2 ответа

Вы можете иметь состояние гонки, смешивая сырые Обещания без await а также await-ную. Попробуй заменить = screenshotDesktop.all() с = await screenshotDesktop.all(), Вы также можете оптимизировать код с помощью await исключительно (не уверен что while (1 < 5) значит, кстати)

'use strict';

const fs = require('fs').promises;

const screenshotDesktop = require('screenshot-desktop');
const sharp = require('sharp');

(async () => {
  while (1 < 5) {
    const imgs = await screenshotDesktop.all();
    await fs.writeFile('/Users/ga/proj/overwriteME.jpg', imgs[0]);
    await crop();
  }
})();

async function crop() {
  const resizedImage = await sharp('/Users/ga/proj/overwriteME.jpg');
  const metadata = await resizedImage.metadata();
  console.log(metadata);
}

Согласно комментариям от @titus, sharp.cache(false) установить сразу после того, как оператор импорта работал для меня.

Другие вопросы по тегам