Отправить данные из двух моделей в представление - PullRequest
1 голос
/ 07 апреля 2019

У меня есть шаблон категории и другой продукт.Предшествовал, чтобы возвратить эти модели в единственном представлении

router.get('/', function(req, res, next) {
  Category.find({}, function(error, data){
    // something 
  });

  Product.find({}, function(error, data){
    // something
  }); 

  res.render('produtos/index', { 
    categories: Categories,
    Products: Products
  });
});

Ответы [ 3 ]

1 голос
/ 07 апреля 2019

Большинство библиотек объектных моделей, таких как Mongoose или Sequelize, поддерживают Promises, и, вероятно, вы сможете сделать что-то вроде этого

router.get('/', function(req, res, next) {
  const categoryPromise = Category.find({});

  const productPromise = Product.find({}); 

  Promise.all([
    categoryPromise,
    productPromise,
  ]).then(([
    products,
    categories
  ]) => {
    res.render('produtos/index', { 
      categories,
      products
    });
  })
});

В противном случае вы сможете создавать свои собственные обещания, например:

router.get('/', function(req, res, next) {

  const categoryPromise = new Promise((resolve, reject) => {
    Category.find({}, function(error, data){
      error ? reject(data) : resolve(data);
    });
  })


  const productPromise = new Promise((resolve, reject) => {
    Product.find({}, function(error, data){
      error ? reject(data) : resolve(data);
    });
  })

  Promise.all([
    categoryPromise,
    productPromise,
  ]).then(([
    products,
    categories
  ]) => {
    res.render('produtos/index', { 
      categories,
      products,
    });
  })
});
1 голос
/ 07 апреля 2019

As Mongoose и Sequelize оба поддерживают Promises. Сначала вам нужно запросить все категории и продукты и сохранить их временно в переменной, а затем перед отправкой вашего ответа создать, возразить и отправить его , Вот пример. Я бы предпочел async / awit, это сделает ваш код более читабельным и избавит вас от цепочки then().

router.get('/', async function(req, res, next) {
  let category, products;
  try {
    category = await Category.find({});
    products = await Product.find({});

    res.render('products/index', { 
    categories: category,
    Products: products

  });
  } catch (e) {
    return next(e)
  }


});

Также лучше, если вы создадите слой Repository для запросов к вашей базе данных. Также используйте любой шаблон проектирования для структуры проекта

0 голосов
/ 07 апреля 2019

Установите для mongoose pormise значение es6 Promise, например mongoose.Promise = global.Promise, тогда вы можете использовать async/await для запроса как модели, так и визуализации.

// note async
router.get('/', async function(req, res, next) {
  let categories, product;
  try {
    category = await Category.find({});
    products = await Product.find({});
  } catch (e) {
    return next(e)
  }

  res.render('produtos/index', { 
    categories: categories,
    Products: products
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...