Pregunta

Me pregunto si hay una manera fácil de acceder a las variables de sesión o solicitud de Express.js desde una plantilla de Jade sin pasarla por la respuesta normal.

¿O es esta la única manera?

res.render('/', {
    session: req.session
});
¿Fue útil?

Solución

Necesitarás crear un dynamicHelper para que Express lo use.

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

Luego, dentro de tu plantilla, puedes usar <%= session.logged_in %> o lo que sea.

Nota:Los ayudantes dinámicos están en desuso en Express 3.

Otros consejos

Solo agregue

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

Antes

app.use(app.router);

y obtenga su sesión en jade

p #{session}

En Express 3.x, los DynamicHelpers han sido eliminados, por lo que deberá utilizar una combinación de middleware y res.locals.Digamos que queremos acceder a req.query en una vista /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);

Ahora, cualquier ruta que utilice el middleware localQuery tendrá configurado res.locals.query.Luego se puede acceder a esto en su vista como query.

solo usa 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();
});

Después de lo cual puede usar "# {req}" para referirse a él en una plantilla de jade.

Suponga que tiene un objeto 'usuario' en 'req' y 'usuario' tiene un método 'isAnonymous', si su user.isAnonymous () devuelve verdadero,

p #{req.user.isAnonymous()}

se representará como:

<p>true</p>

esto funcionó para mí

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

en usuario de vista pug o jade

#{user.email}

Si bien en javascript siempre hay una forma de escapar del alcance y arrastrarse hacia arriba, yo realmente realmente realmente realmente realmente te animamos a que encuentres otra forma.

Considere lo que está preguntando: ¿Puedo hacer que mi opinión sepa sobre las entrañas de mi controlador?

O lo que realmente estás preguntando: ¿Puedo hacer que mi vista conozca las entrañas de mi tiempo de ejecución?

Se supone que una vista toma datos y los transforma en marcado.Eso es.Si hace algo más, lo está haciendo mal.No me importa lo "fácil" que sea.Ese es el objetivo de una interfaz.Para definir exactamente lo que se está pasando y facilitar la sustitución de una cosa por otra.

Puede resolver esto con una función de renderización en la que se utiliza para renderizar cada vista que necesita la variable de sesión como una variable local accesible en la plantilla (normalmente cuando un usuario está conectado, por ejemplo).

Aquí hay un ejemplo de una función, pero puede ajustarla como desee:

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)
    }
}

Entonces puede usarse así:

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

    req.session.user_email = user_email;

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

y en su plantilla de jade puede acceder a las variables de sesión como esta:

div.user-email #{session.user_email}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top