在EJS页面中显示来自Knex的不同查询的数据

时间:2017-10-26 13:35:41

标签: node.js ejs knex.js

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循环循环所有计时器,但我不知道如何显示标签

1 个答案:

答案 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来处理错误案例。