web-dev-qa-db-fra.com

Accéder au req ou à la session Express.js à partir d'un modèle Jade

Je me demande s’il existe un moyen simple d’accéder aux variables req ou de session d’Express.js à partir d’un modèle Jade sans passer par la réponse normale.

Ou est-ce le seul moyen?

res.render('/', {
    session: req.session
});
24
MrBojangles

Vous devrez créer une dynamicHelper à utiliser par Express.

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

Ensuite, dans votre modèle, vous pouvez utiliser <%= session.logged_in %> ou autre chose.

Remarque: dynamicHelpers est obsolète dans Express 3

20
Dominic Barnes

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 obtenez votre session en jade

p #{session}
52
Ajouve

Dans express 3.x, dynamicHelpers a été supprimé. Vous devrez donc utiliser une combinaison de middleware et de res.locals. Disons que nous voulons accéder à req.query dans 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);

Désormais, tout itinéraire utilisant le middleware localQuery aura res.locals.query défini. Vous pouvez alors accéder à cela en tant que query.

45
David Weldon

utilisez simplement 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 vous y référer dans un modèle en jade. 

Supposons que vous ayez un objet 'utilisateur' dans 'req', et que 'utilisateur' utilise la méthode 'isAnonymous', Si votre user.isAnonymous () renvoie true,

p #{req.user.isAnonymous()}

sera rendu comme:

<p>true</p>
3
kaisa1028

Bien qu'il existe toujours un moyen en javascript pour échapper à la portée et ramper vers le haut, je vraiment vraiment vraiment vraiment vraiment vous encourage fortement à trouver un autre moyen.

Réfléchissez à ce que vous demandez: Puis-je avoir mon point de vue sur les entrailles de mon contrôleur?

Ou ce que vous demandez réellement: puis-je avoir mon opinion sur le courage de mon runtime?

Une vue est supposée prendre des données et les transformer en balises. C'est tout. Si vous faites autre chose, vous le faites mal. Je me fiche de la facilité avec laquelle c'est. C'est le point d'une interface. Définir exactement ce qui est adopté et faciliter le remplacement d'une chose par une autre.

1
jcolebrand

cela a fonctionné pour moi

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

en vue carlin ou jade voir l'utilisateur 

#{user.email}
1
Sultan Zaid

Vous pouvez résoudre ce problème avec une fonction de rendu dans laquelle vous utilisez pour rendre chaque vue nécessitant 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 de fonction mais vous pouvez ajuster 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}
0
st0ne