var getTimer = function(owner, callback){
if(owner !== undefined) {
knex.table('timer').where({id_owner : owner.id_user}).select().orderBy('created','asc').then(function(result) {
callback(result);
});
}
}
var getTags = function(timer, callback) {
if(timer !== undefined) {
knex.table('timer_tag').innerJoin('tags', 'id_tg', 'tags.id_tag').where({id_tmr : timer.id_timer}).select('tags.nome_tag').orderBy('tags.nome_tag', 'desc').then(function(result) {
callback(result);
});
}
}
var index = function(req, res, next) {
if(!req.isAuthenticated()){
return res.redirect('/login');
}
else {
var user = req.user;
//here I render the EJS page
getTimer(user, function(results) {
return res.render('index.ejs', {title: "'s Home", user: user, data: results});
})
//------------------
}
};
我在从数据库获取数据时遇到问题,因为我需要从多个表中检索它们,但是在同一页面上显示它们
在EJS页面中,我使用for循环循环所有计时器,但我不知道如何显示标签
答案 0 :(得分:1)
我自己没有使用过Knex.js,但根据您发布的代码,我想我可以试一试。
鉴于您需要提出许多请求并等待结果,最简单的方法是使用promises。你已经有了承诺,但你已经将它们转换为回调。
var getTimer = function(owner) {
return knex
.table('timer')
.where({id_owner: owner.id_user})
.select()
.orderBy('created','asc');
}
var getTags = function(timer) {
return knex
.table('timer_tag')
.innerJoin('tags', 'id_tg', 'tags.id_tag')
.where({id_tmr: timer.id_timer})
.select('tags.nome_tag')
.orderBy('tags.nome_tag', 'desc');
}
请注意,我正在返回Knex创建的承诺,并且回调完全消失了。严格来说,这里的返回值是查询构建器而不是承诺,但它们支持promises接口,因此足够接近。
现在路线:
var index = function(req, res, next) {
if(!req.isAuthenticated()){
return res.redirect('/login');
}
else {
var user = req.user;
getTimer(user).then(function(timers) {
// I'm assuming that 'timers' is an array of objects
// in the same form expected by getTags
var promises = timers.map(getTags);
Promises.all(promises).then(function(tags) {
res.render('index.ejs', {
title: "'s Home",
user: user,
timers: timers,
tags: tags
});
});
});
}
};
我还没有尝试将tags
与其对应的timers
配对,但是它们应该在各自的数组中具有相同的索引,因此您可以进行一些预处理路由器以您想要的格式获取数据,或者您可以在EJS模板中按索引对它们进行配对。
您需要使用.catch
来处理错误案例。