20

ユーザーがサインインに失敗した後にフラッシュメッセージを表示したいのですが、変数を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 })
      )

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

ps connect-flashについては知っていますが、ビューで利用できるようにする方法を理解する必要があります。

これは私のアプリです:

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

2 に答える 2

38

同じ問題を抱えていて、変更によって解決されたという印象を受けたすべての人に簡単な要約を与えるだけ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
于 2012-09-26T08:37:48.300 に答える
9

Express.session () を使用している場合は、express.session() の後、 app.configure() 内の 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}
于 2013-03-05T18:44:51.780 に答える