MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Instruction de rupture illégale (Node.js)

Votre break l'instruction n'est pas à l'intérieur du corps d'une boucle. Il se trouve plutôt à l'intérieur du corps d'une fonction, à savoir findOne rappeler. Pour voir cela plus clairement, il peut être utile d'utiliser temporairement une fonction nommée comme gestionnaire de rappel :

var cb = function(err, data){
    if (data.id){
        uniqueNumber++;
    }
    else {
        saveLandmark(newUnique);
        break;  // not inside a loop!
    }
};

db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){
    //if ID exists already
    if (data.id){
        var uniqueNumber = 1;
        while (1) {
            var uniqueNum_string = uniqueNumber.toString(); 
            var newUnique = data.id + uniqueNum_string;
            db.collection('landmarks').findOne({'id':newUnique}, cb);
        }
    }
    else {
        saveLandmark(uniqueIDer);
    }
});

Il est assez clair maintenant que le break dans le corps de la fonction de rappel n'est pas à l'intérieur d'une boucle ! J'ai également fait en sorte que les choses se cassent d'autres manières parce que le uniqueNumber et newUnique les valeurs ne sont plus dans la portée, mais c'est un autre problème. :) La chose importante à voir ici est qu'une fonction introduit une limite "dure" dans votre code qui peut être difficile à voir en se basant uniquement sur la syntaxe du langage. C'est l'une des raisons pour lesquelles ce style de programmation par rappel peut être si difficile à maîtriser.

En fait, c'est beaucoup plus difficile à faire que ce que votre tentative initiale de code impliquerait. Vous aurez besoin d'un moyen de transmettre un signal de réussite à travers des couches éventuellement arbitraires de rappels lorsque vous appelez à plusieurs reprises findOne et analyser le résultat (de manière asynchrone).

Vous pourriez obtenir de l'aide avec cela en utilisant l'excellent async bibliothèque, par exemple https://github.com/caolan/async#whilst .