gpt4 book ai didi

javascript - res.render 仅在多个数据查询完成后

转载 作者:行者123 更新时间:2023-11-30 08:28:41 25 4
gpt4 key购买 nike

在 server.js 中的 app.get 上,我从 mongo db 返回一个数据集,然后在将数据传递给它的同时呈现我的页面。

如下图所示:

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

//find all data in test table
var articles;
db.collection('test').find().toArray((err, result) => {
if (err) return console.log(err)
articles = result

// renders index.ejs and passes result to quotes
res.render('./pages/index.ejs', {
quotes: articles
})
})
})

我希望能够进行多个数据库查询,然后将多个数据变量传递给我的渲染器,我的问题是当我将 res.render 放在数据库查询之外时,它会尝试在数据库获取之前进行渲染它的数据集。

看看我在下面尝试了什么:

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

//find all data in test table
var articles;
db.collection('test').find().toArray((err, result) => {
if (err) return console.log(err)
articles = result
})

// renders index.ejs and passes result to quotes
res.render('./pages/index.ejs', {
quotes: articles
})
})

我的问题是:

我如何确保渲染在我的数据库查询运行并将数据返回到变量后发生?


Ultimately I would want to be able to do something like this:

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

//find all data in table 1
var AAA;
db.collection('test1').find().toArray((err, result) => {
if (err) return console.log(err)
AAA = result
})

//find all data in table 2
var BBB;
db.collection('test2').find().toArray((err, result) => {
if (err) return console.log(err)
BBB = result
})

//find all data in table 3
var CCC;
db.collection('test3').find().toArray((err, result) => {
if (err) return console.log(err)
CCC = result
})

// renders index.ejs and passes result to quotes
res.render('./pages/index.ejs', {
quotes: AAA,
quotes2: BBB,
quotes3: CCC
})
})

在此方面提供任何帮助或建议,我们将不胜感激。提前谢谢你。

最佳答案

试试这段代码,它没有经过测试,但我认为它应该可以工作:

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

var list = {};

db.collection('test').find().toArray().then(result => {
list.result = result;
}).then(() => {
return Promise.resolve(db.collection('foo').find().toArray());
}).then(result2 => {
list.result2 = result2;
}).then(() => {
return Promise.resolve(db.collection('bar').find().toArray());
}).then(result3 => {
list.result3 = result3;
}).then(() => {
res.render('./pages/index.ejs', list);
}).catch(e => {
console.error(e);
});

});

更新:我们可以对任何返回 Promise 的方法使用 async/await,这样代码会更简洁:

// you can use express-async-errors package to make routes async
app.get('/', async(req, res) => {
let list = [];
list.result = await db.collection('test').find().toArray();
list.result2 = await db.collection('foo').find().toArray();
list.result3 = await db.collection('bar').find().toArray();
res.render('./pages/index.ejs', list);
});

关于javascript - res.render 仅在多个数据查询完成后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41142136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com