Я не знаю, является ли проблема асинхронной, поэтому иногда результат не содержит данных о продукте, а только данные типа. Однако иногда он будет иметь обе данные.
Моя настройка: узел JS, Express, Mongoose
router.get('/', function (req, res, next) {
var data = {};
Product.find().limit(4).populate({path: 'region_id', model: Region})
.then(function (doc) {
data.product = doc;
});
Type.find()
.then(function (doc) {
data.type = doc;
});
res.render('index', {title: 'Home', items: data});
});
Если я прав, то как убедиться, что вся функция find() выполняется перед запуском render().
Спасибо!
Поскольку обе асинхронные операции возвращают Promise
s, вы должны использовать Promise.all
, который будет разрешаться, когда оба завершатся. Нет необходимости в внешнем объекте data
, просто используйте значения разрешенных обещаний напрямую. Кроме того, не забудьте обработать ошибки с помощью catch
при использовании Promises:
router.get('/', function (req, res, next) {
Promise.all([
Product.find().limit(4).populate({path: 'region_id', model: Region}),
Type.find()
])
.then(([product, type]) => {
res.render('index', {title: 'Home', items: { product, type } });
});
.catch((err) => {
// handle errors
});
});