2013-02-10 72 views
2

几周前开始使用Express,最后打到我的第一个路障。我想弄清楚如何发送一个Flash消息到我的视图(layout.jade)。当我验证用户注册并验证失败时(使用express-validator),我想写入会话Flash消息,然后在页面上显示它。会话刷新消息仅在单独刷新后显示,而不显示在快速POST后

我现在正在做的,如果我只刷新工程完成后过帐(例如,在控制器/ index.js),我还需要弄清楚如何只能让这个Flash消息显示一次:

/应用.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; 
    } 

难道只有显示出来后,我刷新(一POST之后),因为我从渲染内/controllers/index.js联接模板,而不是/app.js?另外,我应该在我的配置中做类似delete req.session.messages的事情吗?我无法在任何地方找到完整的例子,而我发现的例子已经过时。

+0

你看着连接闪了吗? – chovy 2013-02-10 23:06:40

回答

1

看起来你确实在使用过时的例子。 Express v3.x不再使用partials。请参阅wiki中的View system changes。请使用blocksincludes

一个简单的方式展现在登录时的错误信息会

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

任何想法如何获得重定向页面上的会话消息? – 2013-02-17 03:16:58

相关问题