Пользовательский помощник шаблона Dust.js в Bootstrap Непоследовательное поведение

У меня есть помощник Dust.js, где я применяю некоторую логику acl следующим образом:

'use strict';

import dust from 'dustjs-linkedin';
import acl from '../config/acl';

dust.helpers.accessControl = function(chunk, context, bodies, params) {
    let userId = params.userId;
    let resource = params.resource;
    let permission = params.permission;

    acl.acl.isAllowed(userId, resource, permission, function(err, res){

        if(res){
            chunk.render(bodies.block, context);
            return chunk;
        }
        else {
            return chunk;
        }
    });
};

В шаблоне:

{@accessControl userId=user._id resource="/admin" permission="get"}
                    <li class="nav-item">
                        <a class="nav-link" ng-class="{'active' : getPath()[0] == 'admin'}" href="/admin">Admin</a>
                    </li>
                {/accessControl}

Помощники вызываются правильно с правильными параметрами, а node_acl правильно авторизует пользователя (res в обратном вызове есть true). Во многих местах в моих шаблонах он отображает предполагаемое поведение, за исключением панели навигации Bootstrap 3, где он обычно ничего не рендерит, а иногда и ниже ul на панели навигации:

Ниже навигационной панели

Какие-нибудь мысли? Обратите внимание, что я использую Angular для размещения активного класса в ссылках, это не SPA, и глубокие ссылки отключены, но это не должно иметь ничего общего, так как шаблоны отображаются на стороне сервера. Спасибо!

1 ответ

Решение

запросы node_acl являются асинхронными. Мне нужно было изменить моего помощника на:

dust.helpers.accessControl = function(chunk, context, bodies, params) {
    let userId = params.userId;
    let resource = params.resource;
    let permission = params.permission;

    return chunk.map(function(chunk) {
        acl.acl.isAllowed(userId, _reverse(resource), permission, function(err, res){
            if(res && bodies['block']) {
                return chunk.render(bodies['block'], context).end();
            }
            else {
                return chunk;
            }
        });
    });
};

преодолеть не по порядку куски.

Другие вопросы по тегам