Node.js: 读取一张被覆盖的图片,仅参考初始图片

Node.js: reading a picture which is being overwritten, references the initial image only

我基本上是在里面覆盖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 读取它时,它从一开始就引用了同一张旧图片。

您可能会在没有 awaitawait 的情况下混合原始 Promise 的竞争条件。尝试用 = await screenshotDesktop.all() 替换 = 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) 在导入语句对我有用后立即设置。