Question

Je me demande s'il existe un moyen facile d'accès variables de req ou de la session express.js à partir d'un modèle Jade sans passer à travers dans la réponse normale.

Ou est-ce la seule façon?

res.render('/', {
    session: req.session
});
Était-ce utile?

La solution

Vous devrez créer un dynamicHelper pour Express pour utiliser.

app.dynamicHelpers({
    session: function (req, res) {
        return req.session;
    }
});

Ensuite, à l'intérieur de votre modèle, vous pouvez utiliser <%= session.logged_in %> ou autre.

Remarque: dynamicHelpers sont désapprouvée dans Express 3

Autres conseils

Il suffit d'ajouter

app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));
app.use(function(req,res,next){
    res.locals.session = req.session;
    next();
});

Avant

app.use(app.router);

et obtenir votre session en jade

p #{session}

Dans 3.x Express, dynamicHelpers ont été supprimés afin que vous aurez besoin d'utiliser une combinaison de middleware et res.locals. Disons que nous voulons req.query d'accès à une vue /signup/new:

localQuery = function(req, res, next) {
  res.locals.query = req.query;
  next();
};

newSignup = function(req, res) {
  res.render('signup/new');
};

app.get('signup/new', localQuery, newSignup);

Maintenant toute voie qui utilise le middleware localQuery, aura set res.locals.query. Cela peut alors accéder à votre point de vue query.

il suffit d'utiliser un middleware.

app.use(function (req, res, next) {
            var origRender = res.render;
            res.render = function (view, locals, callback) {
                if ('function' == typeof locals) {
                    callback = locals;
                    locals = undefined;
                }
                if (!locals) {
                    locals = {};
                }
                locals.req = req;
                origRender.call(res, view, locals, callback);
            };
            next();
});

Après quoi vous pouvez utiliser « # {} req » pour faire référence dans un modèle de jade.

Supposons que vous avez un objet « utilisateur » dans « req » et « utilisateur » a une méthode « isAnonymous », si votre retour user.isAnonymous () true,

p #{req.user.isAnonymous()}

sera rendu comme:

<p>true</p>

cela a fonctionné pour moi

app.use(function(req,res,next){
   res.locals.user = req.user;
   next();
});

utilisateur carlin ou une vue de jade

#{user.email}

Bien qu'il y ait toujours une façon javascript pour échapper à la portée et de ramper vers le haut, je vraiment vraiment vraiment vraiment vraiment vous encourage fortement à trouver une autre façon.

Pensez à ce que vous demandez: Puis-je avoir mon point de vue savoir sur les entrailles de mon contrôleur

Ou ce que vous demandez vraiment: Puis-je avoir mon avis au sujet de savoir le courage de mon exécution

Une vue est censé prendre des données et le transformer en un balisage. C'est tout. Si vous faites quoi que ce soit d'autre, vous le faites mal. Je ne me soucie pas comment « facile » est. C'est le point d'une interface. Pour définir exactement ce qui est passé, et pour le rendre facile de remplacer une chose avec une autre chose.

Vous pourriez résoudre cela avec une fonction render dans lequel vous utilisez pour rendre chaque point de vue qui a besoin de la variable de session en tant que variable locale accessible dans le modèle (généralement lorsqu'un utilisateur est connecté par exemple).

Voici un exemple d'une fonction, mais vous pouvez régler comme vous le souhaitez:

var renderView = function(res, template, context, session, cb) {
    context.session = session;

    if(cb){
        res.render(template, context, function(error, html){
            cb(error, html)
        }
    } else {
        res.render(template, context)
    }
}

Ensuite, il peut être utilisé comme ceci:

app.get("/url", function(req, res){

    req.session.user_email = user_email;

    renderView(res, "template_name", { local_variables: local_variables }, req.session)
});

et dans votre modèle de jade, vous pouvez accéder aux variables de session comme ceci:

div.user-email #{session.user_email}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top