web-dev-qa-db-fra.com

ExpressJs 3.0 Comment passer Res.Locals à une vue Jade?

Je souhaite afficher un message Flash après que un utilisateur ne parvienne pas à vous connecter, mais je ne peux tout simplement pas obtenir les variables de se présenter dans mes vues de jade.

J'ai des morceaux, je sais que je dois l'utiliser dans mon app.configure ():

    app.use (req, res, next) ->
      res.locals.session = req.session

Et je vais définir ce que le message Flash est après que l'utilisateur affiche le mauvais mot de passe:

     exports.postSession = (req, res) ->
       users = require '../DB/users'
       users.authenticate(req.body.login, req.body.password, (user) ->
       if(user)
         req.session.user = user
         res.redirect(req.body.redirect || '/')
       else
         req.session.flash = 'Authentication Failure!'
         res.render('sessions/new', {title:'New', redirect: req.body.redirect })
      )

Je ne sais pas comment accéder à res.locals.session Dans mon fichier jade. Je doute que je puisse tout mettre en place. Cette question est beaucoup comme celle-ci: Migration express.js 2 à 3, spécifiquement app.dynamichelpers () à app.Locals.utilisez-vous? Mais je ne peux toujours pas le faire fonctionner. Il serait très apprécié si quelqu'un ne peut me montrer qu'un simple exemple de réglage de valeurs en res.Local et en accédant dans une vue.

p.s. Je sais à propos de Connect-Flash mais j'ai besoin de comprendre comment faire des choses disponibles sur les points de vue.

Ceci est mon application:

app.configure(() -> 
  app.set('views', __dirname + '/views')
  app.set('view engine', 'jade')
  app.use(express.bodyParser())
  app.engine('.jade', require('jade').__express)
  app.use(express.methodOverride())
  app.use(express.cookieParser())
  app.use(express.session({ store: new express.session.MemoryStore({reapInterval: 50000 * 10}), secret: 'chubby bunny' }))
  app.use(express.static(__dirname + '/public'))
  app.use((req, res, next) ->
    res.locals.session = req.session
    next()
  )
  app.use(app.router)
)
19
aeyang

Juste pour donner un bref résumé de tous ceux qui ont le même problème et ont eu l'impression que cela a été résolu de changer res.redirect.

Il est très important de mettre votre app.use middleware avant app.router. Voir les commentaires de TJ Holowaychuck, l'auteur d'Express

Voici un exemple utilisant une nouvelle installation d'express v3.0.0rc4

app.js:

app.use(function(req, res, next){
  res.locals.variable = "some content";
  next();
})

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

index.jade:

extends layout

block content
  h1= title
  p Welcome to #{title}
  p= variable
36
zemirco

Si vous utilisez Express.Session (), vous devez appeler votre fonction [~ # ~] après [~ # ~ ~] express.session () Mais [~ # ~] avant [~ # ~ ~] app.Router , à l'intérieur de l'application. configurer ().

app.js

app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.session());

  // Give Views/Layouts direct access to session data.
  app.use(function(req, res, next){
    res.locals.session = req.session;
    next();
  });

  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

index.jade

extends layout

block content   
  h1= title   
  p My req.session.var_name is set to #{session.var_name}
9
Adam Albright