Sequelize将多个查询数据发送到页面

时间:2018-04-23 03:47:11

标签: node.js express promise sequelize.js

我正在尝试使用express将多个Sequelize查询的结果显示到一个页面。但是,我无法从一个模型内函数返回数据。我很确定这与我没有正确理解javascript中的promises以及对异步编程的误解有关。

在我的report_ty模型中,我有这个功能:

report_ty.getTopFreedomIndex = function(){
  report_ty.findAll({
      raw: true,
      limit: 10,
      attributes: ['Country','Freedom'],
      order: [['Freedom', 'DESC']]
    }).then(topfreedomindex => {
      console.log(topfreedomindex);
      return topfreedomindex;
    })
  };

在我的控制器中,我试图从该查询中获取数据并以JSON格式将其发送到页面。

var db = require('../models/index.js');

module.exports.index_get = (req, res, next) => {

  var topFreedomIndexPromise = new Promise ((resolve, reject) => {
    db.report_ty.getTopFreedomIndex(err, topfreedomindex) => {
      if(err){
        return reject(err);
      } else {
        return resolve(topfreedomindex);
      }
    }
  })

  Promise.all([topFreedomIndexPromise]).then((results)=>{
    return res.render('index', {topfreedomindex:topfreedomindex});
  }).catch((err) => {
    return next(err);
  })
}

我想创建多个promises并将它们兑现给我可以呈现给页面的变量。

但是,控制器中的代码无法正常工作,因为控制台显示语法错误:意外“。”在db之后。我现在有点失去了如何去做这件事。我将此代码建模在以前使用mongoose和mongoDB的项目代码上。

如果我将findAll代码移动到控制器,我可以使它工作,但在这种情况下我只能运行一个查询。我想运行很多并将模型留在模型中。

非常感谢任何帮助/建议/批评。谢谢!

1 个答案:

答案 0 :(得分:0)

<强>更新

我已经弄明白了!代码应如下所示:

型号:

 report_ty.getBtmFreedomIndex = function(){
    return report_ty.findAll({
        raw: true,
        limit: 10,
        attributes: ['Country','Freedom'],
        order: [['Freedom', 'ASC']]
      })
    };

控制器:

  var topFreedomIndexPromise = db.report_ty.getTopFreedomIndex();
  var btmFreedomIndexPromise = db.report_ty.getBtmFreedomIndex();

  Promise.all([topFreedomIndexPromise, btmFreedomIndexPromise]).then((results)=>{
    console.log(results);
    return res.render('index', {
      topfreedomindex: results[0],
      btmfreedomindex: results[1]
    });
  }).catch((err) => {
    return next(err);
  });