会话闪存消息仅在单独刷新后显示,而不在POST上显示

Session flash messages only showing after a separate refresh and not on POST in express

本文关键字:显示 POST 刷新 消息 闪存 单独 会话      更新时间:2023-09-26

几周前开始使用Express,终于遇到了我的第一个障碍。我正试图弄清楚如何将flash消息发送到我的视图(layout.jaed)。当我验证用户注册时,它没有通过验证(使用快速验证器),我想写入会话flash消息,然后在页面上显示它。

我现在所做的只有在发布后刷新(例如在controllers/index.js中)时才有效,而且我还需要弄清楚如何只显示一次这个flash消息:

/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.jad:

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

它是否只在我刷新后(POST后)显示,因为我从/controllers/index.js而不是/app.js中呈现联接模板?此外,我应该在我的配置中执行类似delete req.session.messages的操作吗?我在任何地方都找不到完整的例子,我发现的那些都已经过时了。

看起来您确实在使用一个过时的示例。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将错误的默认值设置为null。通过这样做,您不必在每次渲染login.jade且不存在error时都设置error变量。

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