2017-09-16 12 views
0

MongoDBのDog.find()Dog.create()の前に実行される前に実行されているMongoDBのDog.findは()Dog.create()

私はちょうど私のように理解できないいくつかの問題を抱えていますそれがどうして起こったのか? 私はちょうどオンラインチュートリアルでmongodbを学び始めました。私は自分のコードをcloud9で練習します。 私はfind()やcreate()のような基本的なクエリを練習していました。 最初にDog.create()メソッドを追加しました。新しい犬を名前パラメータだけで追加し、次にcreate()メソッドの下にDog.find()を追加してdbにあるすべてのデータを検索しました。

しかし、問題はDog.find()が最初に実行され、Dog.createが最後に実行されることです。

以下のコードを投稿しました。

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

結果

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 } 

誰もが私にこれを説明occurs.Canあなたは最初のfindメソッドが実行された結果、その後の作成方法を見ることができますか?

答えて

4

競合状態が作成されました。どちらの呼び出しも非同期です。つまり、すぐには返されないため、データベースが操作を完了するまで待つ必要があります。しかし、同じチックで両方の呼び出しを並行して実行しています。

基本的に、コードは2つのリクエストをMongoDBに送信します。 1つは犬を作り、もう1つは犬を探します。 MongoDBは、両方を並列に処理し、両方の結果を返します。この場合、findコールに要する時間が短くなり、最初にコールバックと呼ばれます。

コールバックの後に実行する場合は、コールバックに入れなければなりません。非同期操作が完了すると、コールバックは呼び出されます。

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

あなたはまた、alexmacにより示唆されるように代わり約束を使用することもできます。

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

それともあなたもasync/awaitを使用することができます。

+1

マングースメソッドは約束を返し、コールバックの代わりにそれらを使用します。 – alexmac

+0

ありがとうございました@Farid Nouri Neshat。確かにチェックアウトはmongoose @ alexmacのメソッドを約束します。 –