进行两次数据库调用,并在一个 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())
})
我正在尝试 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())
})