0

我正在使用 express 3 中的新消息系统,并在处理和验证表单时发现了这个问题。提交无效表单时,提交失败,但不显示错误消息。再次提交时,会显示上次请求的错误消息。我尝试使用本地会话和 Redis 会话,它总是一样的。这是默认的快递项目:

应用程序.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'));
});

索引主体添加:

<% if (hasMessages) { %>
  <ul id="messages">
    <% messages.forEach(function(msg){ %>
      <li class="<%= msg.type %>"><%= msg.msg %></li>
    <% }) %>
  </ul>
<% } %>
  1. / 没有消息
  2. /你好显示'/'
  3. /world 显示“/你好”
  4. 重新加载显示“/世界”

这里有什么问题?

4

1 回答 1

4

如果您不想推迟它们,则根本不需要使用会话,这就是在这种情况下的重点是推迟下一次渲染的消息。当中间件填充“消息”和“hasMessages”时,它实际上没有任何内容,除非之前的请求填充了它们。这通常用于延迟消息,例如“成功更新用户”

于 2012-08-13T20:20:58.810 回答