2015-08-03 5 views
0

Я изучаю mongodb, node.js и mongoose и хочу обновить mongodb, а затем отобразить его в моем браузере. Однако мой код показывает только результаты до моего обновления, хотя я знаю, что база данных уже обновлена.Обновление mongodb и его рендеринг

Так, например, у меня есть два ученика, которых зовут Джон и Том, но когда я обновляю его третьим учеником по имени Фред и пытаюсь отобразить результаты, он дает мне только данные Джона и Тома. Вот мой код:

create: function(req, res) { 
     console.log('creating model'); 
     var newStud = new Models.Student({ 
         surname: req.body.surname, 
         firstname: req.body.firstname, 
        } 
     ); 
     console.log('saving model'); 
     newStud.save(); 
     console.log('rendering model'); 
     Models.Student.find({}, 
      function(err,result){ 
       console.log('finding results'); 
       if (err) { 
        throw err;} 
       else { 
        console.log('returning results'); 
        res.send(result); 
        } 
      } 
     ); 
    }, 

Когда я обновляю его детали Фреда, консоль выводит следующее:

creating model 
saving model 
rendering model 
finding results 
returning results 
POST /students 200 21.629 ms - 5195 

но страница показывает только следующее:

[ 
{ 
"surname": "Smith", 
"firstname":"John" 
"_id": "55bed36461521187445e5b53", 
"__v": 0 
}, 
{ 
"surname": "Peters", 
"firstname":"Tom", 
"_id": "55bed3f6c4faaa63464fc6df", 
"__v": 0 
}, 
] 

Я подозреваю, мой обратный вызов работает неправильно. Может ли кто-нибудь объяснить, почему? Любая помощь очень ценится.

ответ

1

Проблема здесь, конечно, в том, что .save() - это асинхронный метод сам по себе. Поэтому нужно дождаться ответа, прежде чем запрашивать данные из коллекции. В противном случае, скорее всего, не на самом деле создал новый элемент еще:

create: function(req, res) { 
    console.log('creating model'); 
    var newStud = new Models.Student({ 
        surname: req.body.surname, 
        firstname: req.body.firstname, 
       } 
    ); 
    console.log('saving model'); 
    newStud.save(function(err,doc) {   // <-- callback here 
     console.log('rendering model'); 
     Models.Student.find({}, 
      function(err,result){ 
       if (err) { 
        throw err;} 
       else { 
        console.log('returning results'); 
        res.send(result); 
       } 
      } 
     ); 
    }); 
}); 

Поэтому в основном вам нужно «подождать» для другого .save() действия, чтобы ответить, прежде чем идти запрос на всю коллекцию, чтобы увидеть новое дополнение.

Смежные вопросы