如何在 ejs 中包含承诺值?

How to Include promise value in ejs?

我正在 expressejs 的帮助下制作一个小型节点应用程序。 在我的一个控制器中,我 return 一个对象,它有一个承诺 属性 我想包含在我的视图中。我试图弄清楚执行此操作的最佳方法是什么,因为它似乎 ejs 无法处理承诺的值。我考虑改为在模型中包含承诺值,但似乎我过于复杂了需要完成的代码。

如何在 ejs 中轻松呈现 bluebird 承诺值?

控制器

compaintsRouter.get('/', function(req, res) 
{
    var model = data.complaint.findAndCount({
        include: [data.user, {
            model: data.comment,
            include: [data.user]
        }],
        limit: 15,
        offset: 15 * (req.query.page || 0) 
    }).then(function(result){
        res.render('complaints/list', {model: result.rows});
    });
});

ejs 查看模板

<% model.forEach(function(complaint) { %>

    <div class="complaint">
        ... more html here...
        <footer>
            <span class="vote brand-success">
                <% complaint.votesUp().then(function(votes){%> 
                    <%= votes %> 
                <%}) %>
                <span class="glyphicon glyphicon-thumbs-up clickable"></span>
            </span>
        </footer>
        ... more html here...
    </div>

<% }) %>

约定的方法:

votesUp: function() {
    return this.getFollower().then(function(followers){
        var aux = followers
            .selectMany(function(f){return f.UserComplaint})
            .map(function(v){ 
                return ((v.liked === true) ? 1: 0);
            });
        aux.push(0);
        aux.reduce(function(acc, v){
            return acc+v;
        });
    })
}

看起来答案可能是将业务逻辑大量混合到视图中。你能不能早点拿到选票,这样你就不用在模板里乱搞了?看起来很乱。 :)

(ps, +1 以抵消反对票)

我的 orm 似乎缺少一个功能,那就是 sequelize。只要我在查询中包含模型,它们就允许我检索关联。 需要进行的修改如下:

控制器

compaintsRouter.get('/', function(req, res) 
{
    var model = data.complaint.findAndCount({
        include: [data.user, {
            model: data.comment,
            include: [data.user]
        }, {
            model: data.user,
            as: 'follower'
        }],
        limit: 15,
        offset: 15 * (req.query.page || 0) 
    }).then(function(result){
        res.render('complaints/list', {model: result.rows});
    });
});

使用数据的方法:

votesUp: function() {
        var aux = this.follower
            .selectMany(function(f){return f.UserComplaint})
            .map(function(v){ 
                return ((v.liked === true) ? 1: 0);
            });
        aux.push(0);
        return aux.reduce(function(acc, v){
            return acc+v;
        });
    }