Как предложил Rich ie, вы не можете получить доступ к переменным из. Внутри обратных вызовов во внешней области видимости
app.get("/users/:id", function (req, res) {
User.findById(req.params.id, function (err, foundUser) {
if (err) { console.log(err) }
else {
console.log(foundUser)
Item.countDocuments({ UID: req.params.id }, function (err, itemCount) {
if (err) { console.log(err) }
else {
console.log(itemCount)
Item.find({ UID: req.params.id }, function (err, foundItems){
if (err) { console.log(err) }
else {
console.log(foundItems);
res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount})
}
});
}
});
}
});
});
Обратите внимание, что я поместил метод res.render
внутри обратных вызовов, чтобы переменные доступны для него.
РЕДАКТИРОВАТЬ
В соответствии с предложением Марселя Джамана, вам, вероятно, следует использовать async/await
, чтобы сделать код более читабельным. Подробнее о async/await
здесь
app.get("/users/:id", async function (req, res) {
try {
const foundUser = await User.findById(req.params.id);
console.log(foundUser)
const itemCount = await Item.countDocuments({ UID: req.params.id });
console.log(itemCount)
const foundItems = await Item.find({ UID: req.params.id });
console.log(foundItems);
res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount});
} catch(err) {
console.error(err)
}
});
Вы можете заметить, насколько проще этот код, чем тот, что над ним.