Ваш код не работает, потому что переменные, к которым вы пытаетесь получить доступ, например, 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