2012-08-13 70 views
0

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

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

指数身体此外:

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

这里有什么问题?

回答

3

如果你不想推迟它们,你根本不需要使用会话,这就是为了推迟下一个渲染的消息。到中间件填充“消息”和“hasMessages”时,它确实没有任何内容,除非先前的请求填充它们。这通常用于推迟“成功更新用户”这样的消息

+1

因此总之,没有问题:p您可能只是期待着不同的结果,在这种情况下,您根本不需要使用会话 – 2012-08-13 20:24:52

+0

True 。没想到这一点。但消息应该像闪光消息一样工作,不是吗?使用像passport.js这样的图书馆时遇到困难,我猜? – Patrick 2012-08-13 20:31:08

相关问题