在 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 来处理错误情况。