2017-09-16 3 views
0

MongoDB를 Dog.find() Dog.create() 전에 실행되기 전에 실행MongoDB를 Dog.find은() Dog.create()

난 그냥으로 이해할 수없는 몇 가지 문제가 왜 그런 일이 일어나는가? 방금 ​​온라인 튜토리얼로 mongodb를 배우기 시작했습니다. 클라우드에서 코드를 연습합니다 .9. 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 방법을 만들?

답변

4

경쟁 조건이 생성되었습니다. 두 호출 모두 비동기식입니다. 즉, 즉시 호출하지 않으면 데이터베이스가 작업을 완료 할 때까지 기다려야합니다. 그러나 동일한 틱에서 두 호출을 병렬로 실행합니다.

기본적으로 코드는 MongoDB에 두 가지 요청을 보냅니다. 하나는 개를 만들고 다른 하나는 개를 찾습니다. MongoDB는 둘 다 병렬로 처리하고 두 결과를 다시 보냅니다. 이 경우 find 콜백에 걸리는 시간이 짧아 콜백이 먼저 호출됩니다.

다른 하나를 실행하려면 콜백에 넣어야합니다. 또한 alexmac에 의해 약속 대신 같은 제안을 사용할 수 있습니다

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

: 콜백은 비동기 작업이 완료되면 호출됩니다

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. 반드시 몽구스 @ alexmac에서 결제 방법을 약속합니다. 감사합니다. –