【问题标题】:How can I run a command once fs is done writing to a file?fs 写入文件后如何运行命令?
【发布时间】:2021-02-09 23:48:53
【问题描述】:

这里是有问题的代码:

        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`)

我遇到的问题是它在将任何内容附加到文件之前尝试打开/启动scriptsPath/Hotfix.sql。例如,这是我添加到脚本中的 console.log()s 的输出:

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

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

【问题讨论】:

  • 您已经在使用*Sync 版本,那么为什么要切换到异步.appendFile() 而不是坚持使用.appendFileSync()
  • (恕我直言)更好的方法是了解异步代码/函数如何工作以及如何使用它们。然后,这也有望得出结论,它应该是 console.log('File ' + file + ' has been appended') 而不是 'Appending...'(以及您可以在脚本的哪个位置安全地使用附加文件)
  • @Andreas 自从我有机会使用 Node 已经一两年了,我完全忘记了 appendFileSync() 的存在。感谢您的提醒!

标签: javascript node.js fs inquirer inquirerjs


【解决方案1】:

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`)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2021-06-09
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多