web-dev-qa-db-ja.com

ExpressJS 3.0 ja。ビューにres.localsを渡す方法は?

ユーザーがサインインに失敗した後にフラッシュメッセージを表示したいのですが、Jadeビューに変数を表示できません。

私はいくつかの部分を持っています、私はこれを私のapp.configure()で使用する必要があることを知っています:

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

そして、ユーザーが間違ったパスワードを入力した後のフラッシュメッセージを設定します。

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

Jadeファイルのres.locals.sessionにアクセスする方法がわかりません。すべてを正しく設定しているとは思えません。この質問は次のようなものです: Express.js 2から3、具体的にはapp.dynamicHelpers()からapp.locals.use? に移行していますが、私はそれでも動作しません。誰かがres.localに値を設定し、ビューでそれらにアクセスする簡単な例を見せていただければ幸いです。

pS接続フラッシュについては知っていますが、ビューで使用できるようにする方法を理解する必要があります。

これは私のアプリです:

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

同じ問題を抱えており、res.redirectを変更することで解決した印象を得たすべての人に短い要約を与えるためだけに。

app.useミドルウェアの前にapp.routerを置くことは非常に重要です。 expressの作者であるTJ Holowaychuckのコメントをご覧ください。

以下は、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

Express.session()を使用している場合は、関数を呼び出す必要があります[〜#〜] after [〜#〜]express.session()しかし[〜#〜] before [〜#〜]app.router、アプリ内。構成、設定()。

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