第一个调用没有将对象传递到端点



我有一个API,我使用Node/Express/Mongoose,试图调用一个函数来获取多个字段的ID,以填充我的主函数,该函数为特定用户创建一个配置文件卡。

我正在将"owner_id"传递给我的Profile方法。然后,我想引用我的主函数中返回的字段,即Cards文档。

但是,当我试图引用第一次调用的结果时,我得到一个错误,说字段是未定义的。

这是我的代码:

router.route('/')
// CREATE INITIAL PROFILE AND ADD EMAILS, ADDRESSES, PHONES AND BUSINESSES ONE-BY-ONE
.post(function( req, res ){
Profile.findOne({'owner_id': req.body.ownerId}, (err, profile) => {
})

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

});

如有任何反馈,我们将不胜感激。

一般问题

Profile.findOne是一个异步调用。这基本上意味着它需要一些时间来获取配置文件。当它获得概要文件时,它将被传递给作为第二个参数传递的回调函数,并执行该回调函数。

Profile.findOne()调用之后运行的任何操作都将在回调函数之前执行。这是javascript的一个非常常见的问题,您可以在这个非常著名的SOQ/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.

最新更新