sql >> Base de Datos >  >> NoSQL >> MongoDB

Declaración de interrupción ilegal (Node.js)

Tu break declaración no está dentro del cuerpo de un ciclo. Está, en cambio, dentro del cuerpo de una función, a saber, findOne llamar de vuelta. Para ver esto más claramente, puede ser útil usar temporalmente una función con nombre como su controlador de devolución de llamada:

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);
    }
});

Está bastante claro ahora que el break en el cuerpo de la función de devolución de llamada no está dentro de un bucle. También hice que las cosas se rompieran de otras maneras porque el uniqueNumber y newUnique los valores ya no están en el alcance, pero ese es un tema diferente. :) Lo importante que hay que ver aquí es que una función introduce un límite "duro" en su código que puede ser difícil de ver basándose únicamente en la sintaxis del lenguaje. Esta es una de las razones por las que este estilo de programación de devolución de llamada puede ser tan difícil de hacer bien.

De hecho, es mucho más difícil hacer esto de lo que implicaría su intento original en el código. Deberá tener una forma de pasar una señal de éxito a través de capas posiblemente arbitrarias de devoluciones de llamada a medida que llama repetidamente a findOne y analizar el resultado (asincrónicamente).

Puede obtener ayuda con esto utilizando el excelente async biblioteca, por ejemplo https://github.com/caolan/async#whilst .