it-swarm.com.de

Zugriff auf die Express.js-Anforderung oder -Sitzung über die Jade-Vorlage

Ich frage mich, ob es eine einfache Möglichkeit gibt, innerhalb einer Jade-Vorlage auf die req- oder Sitzungsvariablen von Express.js zuzugreifen, ohne die normale Antwort zu übergeben.

Oder ist das der einzige Weg?

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

Sie müssen eine dynamicHelper erstellen, damit Express verwendet werden kann.

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

In Ihrer Vorlage können Sie <%= session.logged_in %> oder was auch immer verwenden.

Hinweis: DynamicHelpers sind in Express 3 veraltet.

20
Dominic Barnes

Einfach hinzufügen

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

Vor

app.use(app.router);

und hol deine Session in Jade

p #{session}
52
Ajouve

In express 3.x wurden dynamicHelpers entfernt. Sie müssen daher eine Kombination aus Middleware und res.locals verwenden. Angenommen, wir möchten auf req.query in einer /signup/new-Ansicht zugreifen:

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

Für alle Routen, die die localQuery-Middleware verwenden, ist res.locals.query festgelegt. Darauf kann in Ihrer Ansicht als query zugegriffen werden.

45
David Weldon

verwenden Sie einfach eine 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();
});

Danach können Sie mit "# {req}" in einer Jade-Vorlage darauf verweisen. 

Angenommen, Sie haben ein 'user'-Objekt in' req 'und' user 'hat eine Methode' isAnonymous ', , Wenn user.isAnonymous () true zurückgibt

p #{req.user.isAnonymous()}

wird wie folgt dargestellt:

<p>true</p>
3
kaisa1028

Während es in Javascript immer einen Weg gibt, dem Umfang zu entkommen und nach oben zu kriechen, ermutige ich wirklich wirklich wirklichwirklich wirklich) Sie dringend, einen anderen Weg zu finden.

Bedenken Sie, was Sie fragen: Kann ich meine Meinung über die Innereien meines Controllers erfahren?

Oder was Sie wirklich fragen: Kann ich meine Sicht über den Mut meiner Laufzeitumgebung wissen lassen?

Eine Ansicht soll Daten aufnehmen und in Markup umwandeln. Das ist es. Wenn Sie etwas anderes tun, machen Sie es falsch. Es ist mir egal, wie "einfach" es ist. Das ist der Punkt einer Schnittstelle. Um genau zu definieren, was passiert wird, und es einfach zu machen, eine Sache durch eine andere zu ersetzen.

1
jcolebrand

das hat für mich funktioniert

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

in Mops oder Jade Ansicht Benutzer 

#{user.email}
1
Sultan Zaid

Sie können dieses Problem mit einer Renderfunktion lösen, in der Sie jede Ansicht, die die Sitzungsvariable als lokale Variable benötigt, auf die in der Vorlage zugegriffen werden kann, darstellt (normalerweise wenn ein Benutzer beispielsweise angemeldet ist).

Hier ist ein Beispiel für eine Funktion, die Sie jedoch nach Belieben anpassen können:

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

Dann kann es so verwendet werden:

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

    req.session.user_email = user_email;

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

in Ihrer Jade-Vorlage können Sie wie folgt auf die Sitzungsvariablen zugreifen:

div.user-email #{session.user_email}
0
st0ne