J'essaie d'écrire un nouveau fichier dans un rappel de recherche de grognement.

Le processus prend et objet, le parcourt pour certaines données, crée un nouveau tableau, puis écrit ce tableau dans un fichier JSON. La partie écriture ne fonctionne pas si bien ...

// onComplete is the callback, job is a returned object.
onComplete: function(job) {
    console.log("Creating file \"localize_template\"...");
    var fs = require('fs');
    var localArray = {};
    var foundEntries = job.matches;

    var stringCount = 0;

    // Drill down to the strings that matched the search.
    for (var foundEntry in foundEntries) {
        // Stay on target...
        if (foundEntries.hasOwnProperty(foundEntry)) {
            var singleEntry = foundEntries[foundEntry];
            // Almost...there...
            for( var match in singleEntry ) {
                if (singleEntry.hasOwnProperty(match)) {

                    // Direct hit!  We've drilled down to the match string itself.
                    var theMatch = singleEntry[match].match;

                    // Now, get the terms inside the strings that were referenced.
                    var terms = theMatch.match(/".*?"/g);

                    // Iterate through those strings and add them as entries in the localArray.
                    for( var i=0; i<terms.length; i++ ) {
                        var term = terms[i].replace(/"/g, '');

                        localArray[term] = 'xx:'+term;
                        stringCount++;
                    }
                }
            }
        }
    }

    fs.writeFile( 'i18n/localize_template.json', localArray, {encoding: 'utf8'}, function(err){
        console.log("File localize_template.json create successfully.");
        if(err) {
            throw err;
        } else {
           console.log("File localize_template.json create successfully.");
        }
    });    
}

Le fichier est en cours de création, mais il est vide. J'ai essayé d'utiliser une chaîne générique Hello World! au lieu de localArray pour tester, mais le fichier est toujours vide.

12
Plummer 22 juil. 2015 à 22:38

4 réponses

Meilleure réponse

Vous devez utiliser la version synchrone:

fs.writeFileSync("./output.txt", "file contents"); 
9
Lacho Tomov 13 sept. 2017 à 13:50

Votre problème devrait être que le fs.writeFile démarre "asynchrone". Essayez de changer le localArray ici (codez en dur pour voir si cela fonctionne):

fs.writeFile( 'i18n/localize_template.json', localArray, callback)

Et là, ça devrait marcher. La solution, je pense que c'est que vous devez utiliser fs.writeFileSync, ou pour initialiser le localArray en dehors de la fonction oncomplete, avant qu'il ne démarre.

2
mega6382 11 sept. 2017 à 13:40

Pour répondre plus clairement, fs.writeFile est asynchrone et le truc de grognement de niveau supérieur ne sait pas attendre les opérations asynchrones démarrées par onComplete. Vous devez savoir comment dire à Grunt que vous avez une opération asynchrone inachevée, sauf il s'agit d'un fonctionnalité que grunt-search ne prend pas en charge. Sinon, lorsque vous revenez de onComplete, grunt-search marquera la tâche comme terminée immédiatement et grunt quittera, provoquant la fermeture du processus de noeud avant la fin de l'écriture asynchrone.

Une autre idée consiste à utiliser grunt.file.write(). Il s'agit d'une API synchrone, elle ne vous obligera donc pas à résoudre le problème de l'impossibilité de dire à Grunt que votre tâche n'est pas terminée. De plus, l'utilisation de cette API fera que votre code supportera comme par magie l'option --no-write de grunt en étant un no-op lorsque l'utilisateur demande un run à sec.

onComplete: function (matches) {
    grunt.file.write('test', JSON.stringify(matches));
},
6
binki 21 août 2016 à 00:27

Essayez de savoir si votre code a

process.exit ()

Pour une raison quelconque, j'en ai un de façon tempérée pour les tests uniquement. Si vous le faites, commentez celui-ci et vous serez prêt à partir. Ma version est la v8.6.0.

3
Ibio Tan 3 oct. 2017 à 20:59