2017-09-16 4 views
0

mongodb Dog.find() vor Dog.create Ausführung()mongodb Dog.find() vor Dog.create Ausführung()

Ich habe gerade ein paar Probleme, die ich nicht verstehen kann, also warum es passiert. Ich fing gerade an, mongodb mit online tutorial zu lernen. Ich übe meinen Code bei cloud9. Ich übte die grundlegenden Abfragen wie find() und create(). Ich habe zuerst die Dog.create() -Methode hinzugefügt, indem ich einen neuen Hund mit nur einem name -Parameter hinzufügte und anschließend unterhalb der create() -Methode Dog.find() hinzufügte, um alle in der db vorhandenen Daten zu finden.

Aber das Problem ist Dog.find() ausgeführt zuerst und die Dog.create wird zuletzt ausgeführt.

Ich habe den folgenden Code geschrieben.

var mongoose= require("mongoose"); 
mongoose.connect("mongodb://localhost/dog_app"); 

var dogSchema = new mongoose.Schema({ 
    name:String 
}); 

var Dog = mongoose.model("Dog", dogSchema); 

Dog.create({ 
    name:"duppy" 
}, function(err, dog){ 
    if(err){ 
     console.log(err); 
    }else{ 
     console.log("created a new dog"); 
     console.log(dog); 
    } 
}); 

Dog.find({}, function(err , dogs){ 
    if(err){ 
     console.log(err); 
    } else{ 
     console.log("retrived from database"); 
     console.log(dogs); 
    } 
}); 

Ergebnisse

adi188288:~/workspace/IntroToNode/Databases $ node dogs.js 
(node:7113) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client 
retrived from database 
[ { _id: 59bd6256bffba3198bce7e87, name: 'Puppy', __v: 0 } ] 
created a new dog 
{ __v: 0, name: 'Puppy2', _id: 59bd6932a2d4c81bc9488b74 } 

Sie können die Ergebnisse sehen, die zuerst eine der find-Methode ausgeführt wird und dann create-Methode occurs.Can Wer mir dies erklären?

Antwort

4

Sie haben eine Race Condition erstellt. Beide Aufrufe sind asynchron, dh sie kehren nicht sofort zurück, sondern müssen warten, bis die Datenbank ihre Operation abgeschlossen hat. Sie führen jedoch beide Aufrufe parallel aus, indem Sie sie im selben Häkchen ausführen.

Grundsätzlich sendet Ihr Code zwei Anfragen an MongoDB; eines, dass es einen Hund schafft und das andere sucht nach den Hunden. MongoDB verarbeitet beide parallel und sendet das Ergebnis von beiden zurück. In diesem Fall dauerte der Anruf find weniger Zeit, also rief er zuerst seinen Rückruf an.

Wenn Sie eine nach der anderen ausführen möchten, müssen Sie sie in den Rückruf setzen.

Dog.create({ 
    name:"duppy" 
}, function(err, dog){ 
    if(err){ 
     console.log(err); 
    }else{ 
     console.log("created a new dog"); 
     console.log(dog); 

     Dog.find({}, function(err , dogs){ 
      if(err){ 
       console.log(err); 
      } else{ 
       console.log("retrived from database"); 
       console.log(dogs); 
      } 
     }); 
    } 
}); 

Sie verspricht wollen können auch durch alexmac statt wie vorgeschlagen verwenden: Der Rückruf wird nur einmal die Asynchron-Vorgang abgeschlossen bezeichnet werden

Dog.create({ 
    name:"duppy" 
}).then(function(dog){ 
    console.log("created a new dog"); 
    console.log(dog); 
    return Dog.find({}); 
}).then(function(dogs){ 
    console.log("retrived from database"); 
    console.log(dogs); 
}); 

Oder Sie sogar async/await verwenden können.

+1

Mongoose-Methoden geben die Versprechen zurück, verwenden sie statt Callbacks. – alexmac

+0

Vielen Dank @Farid Nouri Neshat. und wird sicher auschecken verspricht Methode in mongoose @ alexmac.Vielen Dank Ihnen beiden –

Verwandte Themen