Общая проблема
Profile.findOne
- это асинхронный вызов.Это в основном означает, что требуется некоторое время, чтобы получить профиль.Когда он получает профиль, он будет передан функции обратного вызова, переданной в качестве второго параметра, и эта функция обратного вызова будет выполнена.
Все, что вы запускаете сразу после вызова Profile.findOne()
, будет выполнено до того, как функция обратного вызова.Это действительно распространенная проблема с javascript, и вы можете получить более подробную информацию об этом в этой действительно известной SO Q / A .
Решение
В вашем случаеВы можете просто переместить весь свой код, которому требуется profile
, в функцию обратного вызова:
Profile.findOne({'owner_id': req.body.ownerId}, (err, profile) => {
//this is the body of the callback function. It will be called some time after `findOne` is called.
var card = new Card();
card.owner_id = req.body.ownerId;
card.card_name = req.body.card_name;
card.card_subtitle = req.body.card_subtitle;
card.card_type = req.body.card_type;
card.card_color = req.body.card_color;
card.first_name.item = req.body.first_name ;
card.first_name._id = profile.first_name._id;
card.last_name.item = req.body.last_name;
card.last_name._id = profile.last_name._id;
card.company = req.body.company;
card.title = req.body.title;
card.initial.item = req.body.initial ;
card.initial._id = profile.initial._id;
card.birthday.item = req.body.birthday ;
card.birthday._id = profile.birthday._id;
card.highschool.item = req.body.highschool;
card.highschool._id = profile.highschool._id;
card.college.item = req.body.college ;
card.college._id = profile.college._id;
card.facebook.item = req.body.facebook;
card.facebook._id = profile.facebook._id;
card.linkedin.item = req.body.linkedin ;
card.linkedin._id = profile.linkedin._id;
card.linkedin_bus.item = req.body.linkedin_bus ;
card.linkedin_bus._id = profile.linkedin_bus._id;
card.twitter.item = req.body.twitter ;
card.twitter._id = profile.twitter._id;
card.google.item = req.body.google ;
card.google._id = profile.google._id;
card.pinterest.item = req.body.pinterest;
card.pinterest._id = profile.pinterest._id;
card.user_image.item = req.body.user_image;
card.user_image._id = profile.user_image._id;
card.phones = req.body.phones;
card.emails = req.body.emails;
card.addresses = req.body.addresses;
card.businesses = req.body.businesses;
card.save(function(err){
if(err)
res.send(err);
res.send({message:'Card has been added'});
});
});
console.log(profile); // now, however, this line is executed immediately. At this point, profile is not even
// retrieved from the database. Even if the database call was somehow instant, here `profile` is not even in the scope.