Первый вызов не передает объект в конечную точку - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть API, где я использую Node / Express / Mongoose, где я пытаюсь вызвать функцию, чтобы получить идентификаторы для нескольких полей, чтобы заполнить мою основную функцию, которая создает карточку профиля для конкретного пользователя.

Я передаю 'owner_id' методу моего профиля.Затем я хочу сослаться на возвращенные поля в моей основной функции, которая является документом 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'});
  });



});

Любая обратная связь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 декабря 2018

Общая проблема

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...