【问题标题】:Best way to fetch data from many tables in node.js从 node.js 中的许多表中获取数据的最佳方法
【发布时间】:2018-12-19 22:44:50
【问题描述】:

如果我的(mvc 项目)中有一个视图包含来自数据库中许多表的数据,那么在不进入末日嵌套树的情况下获取它们的最佳方法是什么

Model1.findAll().then(model1Data => {
  Model2.findAll().then(model2Data => {
    Model3.findAll().then(model3Data => {
      Modeln.findAll().then(modelnData => {
        res.render('view', {
          model1Data: model1Data,
          model2Data: model2Data,
          model3Data: model3Data,
          modelnData: modelnData
        });
      })
    })
  })
})

注意:以上查询没有where子句、连接或任何其他条件

【问题讨论】:

  • 如果你有 Sequelize Associations beetwin 你的模型,你可以使用 Include 来提取所有数据link 如果没有,你可以考虑有一个单独的文件夹包含你所有的模型逻辑并调用每个需要的函数,此外,如果您需要在其他视图中显示一些信息(不是所有数据),这应该会有所帮助
  • async / await 语法也应该适用于这种情况
  • 我已经有一个单独的模型逻辑文件夹,但是当我调用每个模型时都会发生同样的问题,因为返回的值将是承诺的,我必须使用嵌套才能完全使用它们
  • @vivek-doshi 答案应该可以!

标签: mysql node.js async-await sequelize.js es6-promise


【解决方案1】:

在这里您可以使用Promise.all()async/await 两种方式:

Promise.all():

const promises = [
    Model1.findAll(),
    Model2.findAll(),
    Model3.findAll(),
    Modeln.findAll()
]

Promise.all(promises).then((data) => {
    res.render('view', data );
});

异步/等待:

let model1Data = await Model1.findAll();
let model2Data = await Model2.findAll();
let model3Data = await Model3.findAll();
let modelnData = await Modeln.findAll();
res.render('view', {
    model1Data: model1Data,
    model2Data: model2Data,
    model3Data: model3Data,
    modelnData: modelnData
});

注意:

如果查询不依赖,我建议使用 Promise.all() 彼此,因为它将开始执行并且不等待 第一个像在 async/await 中一样完成。

更多详情:DO READ

【讨论】:

  • 第一种方法对我很有效,但第二种方法给我以下错误:SyntaxError: await is only valid in async function
  • 是的,你必须在函数 your_func_name() 之前放置 async,拜托。查看任何你会明白的异步等待函数,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2016-05-22
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多