Express.js View “globals”

后端 未结 7 1642
太阳男子
太阳男子 2020-12-24 01:16

I\'m using Express.js (on Node.js) and I know that you can render a view with custom data via the \"locals\" parameter. (res.render(\"template\", { locals: { foo: \"ba

7条回答
  •  礼貌的吻别
    2020-12-24 01:42

    This is a buried response, but I finally got it to work.

    1) This is an example around the module connect-flash

    2) Add a piece of middleware in server.js/app.js to add req to locals. This allows the template to call request.flash() whenever it needs. Without this, flash() gets consumed on each request/redirect defeating the purpose.

    var app = module.exports = express()
      , flash=require('connect-flash');
    app.configure(function(){
      ...
      app.use(express.session({ secret: "shhh" }));
    
      // Start Router
      app.use(flash());
      app.use(function(req, res, next) {
        res.locals.request = req;
        next();
      });
    
      app.use(app.router);
    });
    

    3) Setup your route as normal (this is coffeescript, but nothing special)

    app.get '/home', (req, res) ->
      req.flash "info", "this"
      res.render "#{__dirname}/views/index"
    

    4) Call request.flash() when you want the messages. They are consumed on each call, so don't console.log them or they'll be gone :-)

    !!!
    html
      head
        title= config.appTitle
        include partials/_styles
    
      body
        include partials/_scripts
    
        #header
          a(href="/logout") Logout CURRENTUSER
          h2= config.appTitle
    
        #messages
          - var flash = request.flash()
          each flashType in ['info','warn','error']
            if flash[flashType]
              p.flash(class=flashType)
                = flash[flashType]
    
    
        block content
          h1 content here
    

提交回复
热议问题