Voici le code en question:

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

Le problème que je rencontre est qu'il tente d'ouvrir / démarrer scriptsPath/Hotfix.sql avant que quoi que ce soit n'ait été ajouté au fichier. Par exemple, voici la sortie des console.log () s que j'ai ajouté au script:

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

Est-il possible que le script attende la fin de la boucle for avant d'essayer d'exécuter la commande?

0
Revircs 27 oct. 2020 à 19:31

2 réponses

Meilleure réponse

Remplacez la méthode asynchrone par la méthode synchrone pour que le code attende terminé.

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`)
1
Lahiru Tennakoon 27 oct. 2020 à 17:48

Utilisez .appendFileSync() et supprimez le rappel (err)=>, ou écrivez votre code entièrement asynchrone.

Il existe une version asynchrone de l'API fs, vous pouvez y accéder via require('fs').promises.

Dans ce cas, vous devrez utiliser await, votre code doit être une fonction asynchrone. Pour un script utilitaire qui ne fait qu'une chose, l'avantage de le faire de cette façon est discutable.

1
Tomáš Zato - Reinstate Monica 27 oct. 2020 à 16:40