我正试图建立一个管理仪表板,而这个管理仪表板的一部分,我想展示mongoose数据,如用户和最近完成的辅导课程。我在保存这些数据并在渲染页面时将其分配给EJS参数时遇到了麻烦。
// Admin Dashboard
// Find students
function getUsers() {
User.find({tutor:false}, function(err, foundItems) {
return foundItems
})}
// Find sessions
function getSessions() {
Session.find({}, function(err, foundItems) {
return foundItems;
})}
app.get('/admin', function(req, res){
res.render("pages/admin", {
users: getUsers(),
sessions: getSessions()
})
});
第一个观察。
User.find()
是一个异步函数,也就是说,程序的主流程不会等待它的执行,因此... ... undefined
将被传递给JS对象。为了避免这种情况,你必须返回一个承诺,或者使用async await。下面是一个例子。
async function getUsers() {
const foundItems = await User.find({tutor:false})
return foundItems;
}
// Find sessions
async function getSessions() {
const foundItems = await Session.find({});
return foundItems;
}
app.get('/admin', async function(req, res){
res.render("pages/admin", {
users: await getUsers(),
sessions: await getSessions()
})
});
这更容易读懂. 你可以让它更短。
async function getUsers() {
return User.find({tutor:false});
}
// Find sessions
async function getSessions() {
return Session.find({});
}
app.get('/admin', async function(req, res){
res.render("pages/admin", {
users: await getUsers(),
sessions: await getSessions()
})
});
因为你直接返回foundItems(没有在任何地方使用它),你不需要等待它, 你可以直接返回承诺的回调来等待。