在 EJS 页面中显示来自 Knex 的不同查询的数据
Display data from different queries from Knex in EJS page
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 循环循环所有计时器,但我也不知道如何显示标签
我自己还没有用过 Knex.js,但根据你发布的代码,我想我可以试一试。
鉴于您需要发出许多请求并等待结果,最简单的方法是使用承诺。您已经有承诺,但您已将它们转换为回调。
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');
}
请注意,我正在 returning 由 Knex 创建的承诺,并且回调完全消失了。严格来说,这里的 return 值是查询构建器而不是承诺,但它们支持承诺接口,所以这已经足够接近了。
现在的路线:
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
来处理错误情况。
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 循环循环所有计时器,但我也不知道如何显示标签
我自己还没有用过 Knex.js,但根据你发布的代码,我想我可以试一试。
鉴于您需要发出许多请求并等待结果,最简单的方法是使用承诺。您已经有承诺,但您已将它们转换为回调。
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');
}
请注意,我正在 returning 由 Knex 创建的承诺,并且回调完全消失了。严格来说,这里的 return 值是查询构建器而不是承诺,但它们支持承诺接口,所以这已经足够接近了。
现在的路线:
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
来处理错误情况。