首页 > 解决方案 > node.js 在文件中所做的更改直到第二次运行才反映

问题描述

我正在将所有.png文件转换为.jpg目录中的文件,然后对它们进行一些操作,这些操作只能针对jpeg文件。但node.js在我再次运行相同的脚本之前,似乎没有注意到转换后的文件和删除的 png 文件。

    const fs = require('fs')
    const pngToJpeg = require('png-to-jpeg');

    let dirrCont = fs.readdirSync( dir );

    files = dirrCont.filter( ( elm ) => /.*\.(png|jpg)/gi.test(elm) );


    for (i in files)
    {  
        let file = files[i]
        let file_name_without_ext = file.replace(/\.[^/.]+$/, "")
        let extension = file.match(/\.[^/.]+$/)
        if (extension[0] == '.png')
        {
            console.log('found')
            let buffer = fs.readFileSync(dir+file);
            pngToJpeg({quality: 100})(buffer)
            .then(output => fs.writeFileSync(dir+file_name_without_ext+'.jpg', output));
            fs.unlinkSync(dir+file)
            extension = '.jpg'
        }
        let target_file = target + file_name_without_ext + '.' + suffix  + extension

    // do some manipulations on dir+file_name_without_ext+extension

png我总是收到找不到新 jpg 文件的错误,因此尽管文件被转换为文件,但操作不起作用jpg。当我再次运行相同的脚本时,现在所有文件都是jpeg这次运行的文件操作。

编辑

正如@CertainPerformance 的答案之一所建议的那样,我更改了代码以在 then 块内完成我的大部分工作,但再次遇到相同的错误

for (i in files)
{  
    let file = files[i]
    let file_name_without_ext = file.replace(/\.[^/.]+$/, "")
    let extension = file.match(/\.[^/.]+$/)
    if (extension[0] == '.png')
    {
        console.log('found')
        let buffer = fs.readFileSync(dir+file);
        pngToJpeg({quality: 100})(buffer)
        .then(output => {
        fs.writeFileSync(dir+file_name_without_ext+'.jpg', output);
        extension = '.jpg'

        //
        let target_file = target + file_name_without_ext + '.' + suffix  + extension
        // Do some manipulations
        // I am done with the manipulations and I now want to delete
        // the jpg file I just created
        fs.unlinkSync(dir+file_name_without_ext+'.jpg') // Gives me back the same error
        });
    } 

注意:编辑中有一些变化,我正在删除jpg文件而不是png文件(我最初是这样做的)

标签: javascriptnode.js

解决方案


正如您所看到的.then,pngToJpeg是异步的 - 如果您想在 上进行工作dir+file_name_without_ext,您必须先等待初始.thenwriteFileSync解决。将依赖于异步操作的所有内容放在then. 例如:

if (extension[0] == '.png') {
  console.log('found');
  const buffer = fs.readFileSync(dir + file);
  pngToJpeg({ quality: 100 })(buffer)
    .then(output => {
      fs.unlinkSync(dir + file);
      fs.writeFileSync(dir + file_name_without_ext + '.jpg', output);
      extension = '.jpg';
      const target_file = target + file_name_without_ext + '.' + suffix + extension;
      // do some manipulations on dir+file_name_without_ext+extension
    });
}

(您还应该注意不要隐式创建全局变量。例如,for (const i in files)改为使用,或者可能for (const file of files)避免不得不摆弄不重要的指标)


推荐阅读