пн goose сохранить по ссылке несколько документов - PullRequest
0 голосов
/ 19 марта 2020

Я хотел бы сделать новый документ по ссылке на два документа.

**app.post('/student_badge/register', async (req, res) => {
const name = req.body.name;
const category = req.body.category;

People.find({name: name}, '_id', function (err, doc) {
    if (err) return handleError(err);
    var obj = eval(doc);
    id = obj[0]._id;
  })

  Badge.find({category: category}, 'points title', function (err, doc)  {
      if (err) return handleError(err);
      var obj2 = eval(doc);
      points = obj2[0].points;
      title = obj2[0].title;
      console.log(title + "  " + points);
  });


  data = {
    id: id,
    title: title,
    points: points
  }


  console.log("data: " + data);   
  const sbadge = new StudentBadge(data);

  sbadge.
  save()
  .then(result => {
    res.status(201).json({
      message: 'Post created successfully!',
      post: result
    });
  })
  .catch(err => {
    console.log(err);
  });
});**

Но я не могу назвать три переменные, такие как id, title, points, чтобы сохранить их в «данных». Как я могу назвать переменные?

Спасибо

1 Ответ

1 голос
/ 19 марта 2020

Ваш код не работает, потому что переменные, к которым вы пытаетесь получить доступ, например, id, title, points, устанавливаются в функции обратного вызова, которая выполняется асинхронно.

Я бы предложил использовать async / await вместо обратных вызовов чтобы впоследствии вы могли использовать данные из других запрашиваемых вами документов в той же функции. Кроме того, я предлагаю использовать findOne(), поскольку у вас есть доступ только к первой записи в БД.

Должно работать что-то вроде приведенного ниже примера: (Я абстрагировал промежуточное программное обеспечение в отдельной функции для ясности использования с express)

const createStudentBadge = async (req, res, next) => {
  const {name, category} = req.body;

  let person, badge;
  try {  
    person = await Person.findOne({name}); // shortcut for {name: name}
    badge = await Badge.findOne({category});
  } catch(err) {
    // handle error
  }

  if (!person || !badge) {
    // Handle case where no document has been found in db
    // This case will not throw an error when calling find()
  }

  data = {
    id: person._id,
    title: badge.title,
    points: badge.points
  }

  const studentBadge = new StudentBadge(data);

  try {
    await studentBadge.save();
  } catch(err) {
    // handle error
  }

  res.status(201).json({
    message: 'Post created successfully!',
    post: studentBadge
  });
}

app.post('/student_badge/register', createStudentBadge);

Если вы хотите выполнить запрос параллельно, вы можете использовать Promise.all() и запускать оба запроса одновременно. Более подробную информацию можно найти в Документация MDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...