sql >> Databáze >  >> NoSQL >> MongoDB

Neplatný příkaz přerušení (Node.js)

Vaše break příkaz není uvnitř těla smyčky. Místo toho je uvnitř těla funkce, jmenovitě findOne zpětné volání. Abyste to viděli jasněji, může být užitečné dočasně použít pojmenovanou funkci jako obsluhu zpětného volání:

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

Nyní je zcela jasné, že break v těle funkce zpětného volání není uvnitř smyčky! Kvůli uniqueNumber jsem také věci pokazil jinými způsoby a newUnique hodnoty již nejsou v rozsahu, ale to je jiný problém. :) Zde je důležité vidět, že funkce zavádí do vašeho kódu „tvrdou“ hranici, kterou může být obtížné vidět čistě na základě syntaxe jazyka. To je jeden z důvodů, proč může být tento styl zpětného volání tak složitý, aby bylo správné.

Ve skutečnosti je to mnohem obtížnější, než by naznačoval váš původní pokus o kód. Když opakovaně voláte findOne, budete potřebovat způsob, jak předat signál o úspěchu prostřednictvím možná libovolných vrstev zpětných volání a analyzovat výsledek (asynchronně).

S tím můžete získat pomoc pomocí skvělého async knihovna, například https://github.com/caolan/async#whilst .




  1. mongodb najít porovnáním hodnot polí

  2. Nakonfigurujte Mongo pomocí mongodb+srv

  3. Vložte nový objekt do pole pole vnořeného dokumentu v mongoose

  4. Porozumění indexům MongoDB