文件中的node.js更改直到第二次运行才反映出来

时间:2018-07-07 00:03:14

标签: javascript 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

我总是收到这样的错误:找不到新的jpg文件,因此尽管png文件已转换为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文件(我原来是这样做的)

1 个答案:

答案 0 :(得分:3)

.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)来避免摆弄无关紧要的索引)