【问题标题】:Sequelize sending multiple queries data to pageSequelize 向页面发送多个查询数据
【发布时间】:2018-10-03 00:42:05
【问题描述】:

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

在我的 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);
  })
}

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

但是,控制器中的代码不起作用,因为控制台说存在语法错误:意外'。'分贝后。我目前对如何去做这件事有点迷茫。我在以前项目的代码上建模了这段代码,该代码使用了 mongoose 和 mongoDB。

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

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

【问题讨论】:

  • console.log(db) 的输出是什么。您的模型相对路径是否正确?此外,在您的函数getTopFreedomIndex 中,您应该return 否则如果未定义
  • 谢谢阿比纳夫。 db 对象是我的所有模型的集合,其中 db.report_ty 是我的 report_ty 模型。 db 的 console.log 仅输出 sequelize 连接详细信息和相关模型。不过,添加一个返回到该函数有帮助!我现在可以在我的控制器中为我的函数添加一个 .then 方法并将其分配给一个变量。我的下一个问题是:我将如何在一个 Promise.all 中关闭所有这些并将它们传递到页面?还是有另一种更清洁的方法来做到这一点?而不是使用 Promise.all?再次感谢。
  • 很好,它有帮助。你想用不同的参数多次调用getTopFreedomIndex
  • 我想调用不同的函数,例如 getBtmFreedomIndex,它会使用与所列函数类似的另一个函数来运行不同的查询。我会在控制器中调用它们,然后 res.send 所有变量。如果我尝试将函数的返回值存储在变量中,它会给我一个未实现的承诺对象而不是数据集。
  • @AbhinavD 我想通了! promise 变量应如下所示: var topFreedomIndexPromise = db.report_ty.getTopFreedomIndex();` 控制器代码应为:Promise.all([topFreedomIndexPromise]).then((results)=>{ console.log(results); return res.render('index', { topfreedomindex: results[0] }); }).catch((err) => { return next(err); }); 谢谢大家的帮助!

标签: node.js express promise sequelize.js


【解决方案1】:

更新

我想通了!代码应如下所示:

型号:

 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);
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多