Frage

Ich frage mich, ob es eine einfache Möglichkeit gibt, aus einer Jade-Vorlage heraus auf die Anforderungs- oder Sitzungsvariablen von Express.js zuzugreifen, ohne sie über die normale Antwort weiterzuleiten.

Oder ist dies der einzige Weg?

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

War es hilfreich?

Lösung

Sie müssen einen generischen Codetagcode erstellen, damit Express ihn verwenden kann.

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

Dann können Sie in Ihrer Vorlage dynamicHelper oder was auch immer verwenden.

Hinweis: dynamicHelpers sind in Express 3 veraltet

Andere Tipps

Fügen Sie einfach hinzu

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 erhalten Sie Ihre Sitzung in Jade

p #{session}

In Express 3.x wurden dynamicHelpers entfernt, sodass Sie eine Kombination aus Middleware und res.locals verwenden müssen.Angenommen, wir möchten in einer req.query-Ansicht auf /signup/new 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 jede Route, die die Middleware localQuery verwendet, ist res.locals.query festgelegt.Darauf kann in Ihrer Ansicht dann als query zugegriffen werden.

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 'Benutzer'-Objekt in' req 'und' Benutzer 'hat eine Methode' isAnonymous '. Wenn Ihr user.isAnonymous () true zurückgibt,

p #{req.user.isAnonymous()}

wird wie folgt gerendert:

<p>true</p>

das hat bei mir funktioniert

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

im Mops- oder Jadeansichtsbenutzer

#{user.email}

Während es in Javascript immer eine Möglichkeit gibt, dem Gültigkeitsbereich zu entkommen und nach oben zu kriechen, bin ich wirklich wirklich wirklich wirklich wirklich ermutige Sie nachdrücklich, einen anderen Weg zu finden.

Überlegen Sie, was Sie fragen: Kann ich meine Ansicht über die Eingeweide meines Controllers informieren?

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

Eine Ansicht soll Daten aufnehmen und in Markups 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 übergeben wird, und um es einfach zu machen, eine Sache durch eine andere zu ersetzen.

Sie können dies mit einer Renderfunktion lösen, mit der Sie jede Ansicht rendern, die die Sitzungsvariable als lokale Variable benötigt, auf die in der Vorlage zugegriffen werden kann (normalerweise, wenn beispielsweise ein Benutzer 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 folgendermaßen verwendet werden:

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

    req.session.user_email = user_email;

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

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

div.user-email #{session.user_email}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top