fs 完成写入文件后,如何 运行 命令?

How can I run a command once fs is done writing to a file?

这里是有问题的代码:

        const scriptFiles = fs.readdirSync(scriptsPath)
            .filter(file => file.endsWith(".sql"));

        for (const file of scriptFiles) {

            var data = fs.readFileSync(`${scriptsPath}/${file}`, 'utf8');
            fs.appendFile(`${scriptsPath}/Hotfix.sql`, data.toString() + "\n", (err) => {
                if (err) throw new Error(err)
                console.log('Appending ' + file + '...')
            })

            process.stdout.cursorTo(0);
        }

        console.log(`start ${scriptsPath}/Hotfix.sql`)
        exec(`start ${scriptsPath}/Hotfix.sql`)

我 运行 遇到的问题是它试图 open/start scriptsPath/Hotfix.sql 在任何内容附加到文件之前。例如,这是我添加到脚本中的 console.log()s 的输出:

start scriptsPath/Hotfix.sql
Appending file1.sql...    
Appending file2.sql...

有没有办法让脚本等到 for 循环完成后再尝试执行命令?

要么使用 .appendFileSync() 并删除 (err)=> 回调,要么将您的代码完全编写为异步。

fsAPI有一个异步版本,您可以通过require('fs').promises访问它。

在这种情况下,您将不得不使用 await,您的代码必须是异步函数。对于只做一件事的实用程序脚本,这样做的好处值得怀疑。

appendFile()异步方法替换为appendFileSync() 同步方法,以便代码等待循环完成。

const scriptFiles = fs.readdirSync(scriptsPath)
  .filter(file => file.endsWith(".sql"));

for (const file of scriptFiles) {

  var data = fs.readFileSync(`${scriptsPath}/${file}`, 'utf8');
  fs.appendFileSync(`${scriptsPath}/Hotfix.sql`, data.toString() + "\n");

  process.stdout.cursorTo(0);
}

console.log(`start ${scriptsPath}/Hotfix.sql`)
exec(`start ${scriptsPath}/Hotfix.sql`)