Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js在文件中所做的更改直到第二次运行时才会反映出来_Javascript_Node.js - Fatal编程技术网

Javascript node.js在文件中所做的更改直到第二次运行时才会反映出来

Javascript node.js在文件中所做的更改直到第二次运行时才会反映出来,javascript,node.js,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( ( el

我正在将目录中的所有
.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
文件(我原来是这样做的)

,你可以通过
看到。
pngToJpeg
是异步的-如果你想在
dir+file\u name\u上工作,而不使用
,您必须先等待初始的
。然后
writeFileSync
解析。将依赖于异步操作的所有内容放入
中,然后
。例如:

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(文件中的常量i)
,或者
For(文件中的常量文件)
以避免处理不重要的标记)

好的建议。请您解释一下第二部分,为什么最好使用
for(文件中的常量文件)
for(文件中的常量文件)
以及两者之间的区别是什么?当您有一个数组时,
for..of
将迭代数组的值,而
for..in
迭代数组的标记。如果您只使用数组的值,并且只关心标记以便可以获取值,请改用
for..of
。(或者,更好的是,使用数组方法,比如
forEach
),这很神奇。感谢您的解释,我从来没有在问题中添加过编辑,您的解决方案帮助了我,但不是完全帮助了我,仍然有一些事情发生了,我没有得到,删除
jpg
文件回到
中,然后
再次给我文件未找到的错误更具体地说
(节点:98477)UnhandledPromisejectionWarning:错误:eNote:没有这样的文件或目录,
要开始调试,您可以检查一下在
writeFileSync
之后调用
unlinkSync
时会发生什么,只是为了简化一点。我想知道通过
writeFileSync
创建的文件是否会立即创建,或者它们是否需要几毫秒的时间才能显示并使用。(可能尝试设置一个较短的
setTimeout
,看看会发生什么?@CertainPerformance我运行的操作,我使用的是jimp库,这肯定需要保存文件present@CertainPerformance但是超时是有效的,因为库要求文件存在,但是当您稍后调用
unlinkSync
时会抛出错误,这听起来像是导致问题的代码在您的
中的某个位置执行一些操作
-可能文件在其中被删除,这就是
unlinkSync
无法工作的原因<代码>取消链接同步
应该可以工作,即使在
writeFileSync
之后。