Express 3 sessions are always one request behind

I'm working with the new messages system in express 3 and figured this problem, when handling and validating forms. When submitting an invalid form, the submission fails, but there are no error messages displayed. When submitting it again, the error messages from the last request are shown. I tried using local sessions and Redis sessions, it's always the same. This is default express project:

app.js

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , path = require('path');

var app = express();

app.response.message = function(type, msg){
  // reference `req.session` via the `this.req` reference
  var sess = this.req.session;
  // simply add the msg to an array for later
  sess.messages = sess.messages || [];
  sess.messages.push({type: type, msg: msg});
  return this;
};

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  app.use(express.static(path.join(__dirname, 'public')));
  app.use(function(req, res, next) {
    console.log('req.session', req.session.messages);
    var msgs = req.session.messages || [];
    res.locals({
      messages: msgs,
      hasMessages: !! msgs.length
    });
    req.session.messages = [];
    next();
  });
});

app.configure('development', function(){
  app.use(express.errorHandler());
});
app.get('*', function(req, res, next) {
  res.message('hello', req.url);
  next();
});
app.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});
app.get('/hello', function(req, res) {
  res.render('index', { title: 'Express' });
});
app.get('/world', function(req, res) {
  res.render('index', { title: 'Express' });
});
http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

index body addition:

<% if (hasMessages) { %>
  <ul id="messages">
    <% messages.forEach(function(msg){ %>
      <li class="<%= msg.type %>"><%= msg.msg %></li>
    <% }) %>
  </ul>
<% } %>
  1. / there is no message
  2. /hello shows '/'
  3. /world shows '/hello'
  4. reload shows '/world'

What's the problem here?

If you dont want to defer them you don't need to use sessions at all, that's the whole point in this case is to defer messages for the next render. By the time that middleware populates the "messages" and "hasMessages" it really doesn't have any unless the previous request populated them. This is typically used to defer msgs like "updated user successfully"