2017-08-30 2 views
0

Zum Beispiel in dieser Abfrage:Express.js: Welche Möglichkeiten gibt es, das Mugoose-Abfragefeld global für die Vorlagen (Hanldlebars) zugänglich zu machen?

User.findById(req.user._id) 
     .populate({path: 'roles.account', populate: { path: 'groups', select: 'name'} }) 
     .exec(function(err, user) { 
     if (err) { 
      return callback(err, null); 
     } 
     return callback(null, user); 
     }); 

ich den Namen einer Gruppe wie {{user.roles.account.groups.[0].name}} in meinen Vorlagen abrufen kann, wenn ich es res.render Funktion nur für eine bestimmte Strecke passieren.

Wie kann ich erreichen, dass dieser Wert (nicht das gesamte Dokument) global verfügbar ist? Ich habe versucht, eine Methode für das Benutzermodell festzulegen und sie in einem Rückruf an res.locals weiterzugeben, aber es hat nicht funktioniert. Es muss dynamisch sein, abhängig von req.user._id.

Gibt es andere Möglichkeiten, es global zu machen?

+0

Aus dem Aussehen des Codes, nehme ich an, Sie verwenden eine Funktion und übergeben es die 'req', richtig? Wenn ja, warum schreibe ich die Abfrage nicht in den Handler und Sie können 'res.render ('viewName', {user: user})' 'im Callback anstelle von' return callback (null, user) 'verwenden –

+0

Das ist was Sie Wenn Sie eine bestimmte Ansicht rendern möchten, und was ich möchte, ist dieser Wert in allen Ansichten in der App verfügbar, mit ähnlichen Funktionen wie zum Beispiel, wenn Sie etwas in res.locals oder app.locals setzen – ASem

+0

Ich sehe Und Sie haben versucht, es in eine 'app.use (req, res, next) {}' Funktion zu setzen und sie auf 'res.locals' zu setzen? Ist das, was Sie damit gemeint haben, versucht, eine Methode für das Benutzermodell festzulegen? –

Antwort

1

Also schaute ich auf den Link, den Sie zur Verfügung gestellt und bemerkte ein paar Dinge.

Zuerst in der app.use() Funktion, rufen Sie next() nach dem asynchronen Rückruf und nicht in ihm. so heißt es vor dem asynchronen Abschluss.

An zweiter Stelle in der forEach Funktion ist, schreiben Sie ein err Argument, das es muss nicht nach Docs

ich die Schemata erstellt habe und dieser Code funktionierte gut für mich ohne die Notwendigkeit für eine andere Methode:

app.use(function (req, res, next) { 
    if (req.user) { 
    User.findById(req.user._id) 
     .populate({ path: 'roles.account', model: 'Account', populate: { path: 
       'groups', select: 'name' } }) 
     .exec(function (err, user) { 
     if (err) { 
      return err 
     } 
     res.locals.groups = user.roles.account.groups 
     next() 
     }) 
    } else { 
    next() 
    } 
}) 
+0

Gute Lösung, danke. Nur Sie müssen user.roles.account.groups [0] .name verwenden oder es wie {{#each groups}} this {{/ each}} eingeben, da es sich um ein Array handelt – ASem

Verwandte Themen