2

数週間前に Express を使い始め、ついに最初の障害にぶつかりました。ビュー (layout.jade) にフラッシュ メッセージを送信する方法を見つけようとしています。ユーザーのサインアップを検証していて、(express-validator を使用して) 検証に失敗した場合、セッション フラッシュ メッセージに書き込み、それをページに表示したいと考えています。

私が今やっていることは、投稿後に(たとえば、controllers/index.jsで)更新した場合にのみ機能し、このフラッシュメッセージを1回だけ表示する方法も理解する必要があります。

/app.js

/*
 * Configuration
 */
app.configure(function() {
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(expressValidator);
  app.use(express.cookieParser());
  app.use(express.bodyParser({ uploadDir : './' }));
  app.use(express.methodOverride());
  app.use(viewHelpers());
  app.use(function(req, res, next){
    res.locals.messages = req.session.messages || {};
    delete req.session.messages;
    next();
  });
  app.use(express.session({
    secret: config.secret,
    cookie: {
      maxAge: 365 * 24 * 60 * 60 * 1000
    },
    store: new MongoStore(config.db)
  }));
  app.use(express.static(__dirname + '/public'));
  app.use(app.router);
});

/views/layout.jade:

div.alert.alert-error
  - if (typeof messages !== "undefined")
    !=partial('session_flash', { messages : messages })

/views/partials/session_flash.jade:

div.alert.alert-error
  each message in messages
    =message

/controllers/index.js

req.assert(['user', 'username'], 'Please enter a valid username').len(3, 23);
req.assert(['user', 'email'], 'Please enter a valid email').isEmail();
req.assert(['user', 'password'], 'Please enter a valid password').len(3, 23);
req.session.messages = 'Please fix the errors below';
    errors = req.validationErrors();

    if (errors) {
      console.log(errors);
      res.render('join', {
        title : 'Join -',
        errors: errors,
        params: params
      });
      return;
    }

/controllers/index.js結合テンプレートを内部からではなくレンダリングしているため、更新後 (POST 後) にのみ表示され/app.jsますか? また、構成内で次のようなことを行う必要がありdelete req.session.messagesますか? この完全な例をどこにも見つけることができず、見つけたものは古くなっています。

4

1 に答える 1

1

あなたは確かに時代遅れの例を使用しているようです。Express v3.x はパーシャルを使用しなくなりました。wiki でシステム変更を表示するを参照してください。代わりに、ブロックインクルードを使用してください。

ログイン時にエラー メッセージを表示する簡単な方法は次のとおりです。

index.js

app.locals.error = null;

app.post('/login', function(req, res){

  var name = req.body.name;
  var password = req.body.password;

  if (!name || !password) {
    res.status(400);
    return res.render('login', {
      error: 'All fields are required'
    });
  }

})

app.locals.error = nullエラーのデフォルト値を に設定しますnullerrorそうすることで、レンダリングするたびに変数を設定する必要がlogin.jadeなくなり、 noerrorが存在します。

res.render('login', {
  error: null
});

テンプレートlogin.jadeは次のようになります

extends layout

block content
  - if (error)
    p= error
  form(method='post', action='/login')
    p
      label(for='name') Username:
      input(type='text', name='name', id='name')
    p
      label(for='password') Password:
      input(type='password', name='password', id='password')
    p
      input(type='submit', value='Submit')
于 2013-02-12T17:52:54.613 に答える