进行两次数据库调用,并在一个 ejs 页面中呈现由结果填充的两个不同数组的内容

make two db calls and render the content of two different array populated by the results in one ejs page

我正在尝试 express,我必须呈现一个页面,该页面传递两个由两个数据库调用填充的数组, 查询是正确的,事实上,如果我在 ejs 页面中只呈现一个数组,它就会传递内容。
当我传递一个数组时,我会这样做:

dao.getAllSerie().then((show) => {
        res.render('index', {
            series: show,
        })
    }).catch(() => res.status(500).end());

如果我这样做,一切顺利,没有任何错误,内容被呈现并且 ejs 页面充满了价值。
需求是:“如果我必须渲染两个数组,其中填充了对数据库的两次不同调用的两个结果,我该怎么办?”
我试过这个:

app.get('/', (req, res) => {

    series = [];
    categories = [];

    //CALL TO A FUNCTION THAT SELECT FROM DB ASSIGN THE RESULT TO 'SERIES'
    dao.getAllSerie().then((show) => { series = show; })
        .catch(() => res.status(500).end());

    //CALL TO A FUNCTION THAT SELECT FROM DB ASSIGN THE RESULT TO 'CATEGORIES'
    dao.getCategorie().then((category) => { categories = category; })
        .catch(() => res.status(500).end());

    //IN THE RENDER PAGE EACH 'CATEGORIES' AND 'SERIES' ARE NULL
    res.render('index', {
        series: series,
        categories: categories
    })
})

但是 series 和 categories 的结果都是 null,这意味着 ejs 页面在没有动态内容的情况下呈现。
我认为是某种异步问题,有人知道这是否可能以及如何实现吗?
这里的数据库调用函数:

//GET OF ALL SERIES IN THE DB
exports.getAllSerie = function() {
    return new Promise((resolve, reject) => {
        const sql = 'SELECT * FROM serie';
        db.all(sql, (err, rows) => {
            if (err) {
                reject(err);
                return;
            }
            resolve(rows);
        });
    });
};

//GET OF ALL CATEGORIES IN THE DB
exports.getCategorie = function() {
    return new Promise((resolve, reject) => {
        const sql = 'SELECT DISTINCT categoria FROM serie';
        db.all(sql, (err, rows) => {
            if (err) {
                reject(err);
                return;
            }
            resolve(rows);
        });
    });
};

我知道类别应该在一个单独的 table 中,但这只是为了尝试一下。 在此提前感谢大家。真的很感谢

您需要将 2 个异步函数存储在一个数组中,然后使用 Promise.all 等待所有异步调用返回,然后只呈现页面:

app.get('/', (req, res) => {

  let dataFetchers = []

  dataFetchers.push(dao.getAllSerie) // the first async function
  dataFetchers.push(dao.getCategorie) // the second

  Promise.all(dataFetchers) // will wait for ALL promises to resolve or reject
    .then(dataArray => {
      let series = dataArray[0] // the first promise's result
      let categories = dataArray[1] // the second

      res.render('index', { // render only once you have ALL the datum
        series: series,
        categories: categories
      })
    })
    .catch(err => res.status(500).end())
})