Node.js: чтение картинки, которая перезаписывается, ссылается только на исходное изображение - PullRequest
0 голосов
/ 11 февраля 2019

Я в основном перезаписываю 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 будет отражать изменения файла.

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

0 голосов
/ 11 февраля 2019

У вас могут быть условия гонки, смешивающие сырые Обещания без await и await -ing.Попробуйте заменить = 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);
}
...