会话刷新消息只在单独刷新后显示,而不是在快速POST

几个星期前开始与快递,终于打到我的第一个路障。 我试图找出如何发送一个Flash消息到我的看法(layout.jade)。 当我validation用户注册并validation失败(使用express-validator)时,我想写入会话flash消息,然后将其显示在页面上。

我现在所做的只是在刷新AFTER POST之后才起作用(例如在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.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呈现连接模板? 另外,我应该做一些像在我的configuration中delete req.session.messages ? 我找不到任何地方的完整例子,而我发现的例子已经过时了。

看起来你确实在使用一个过时的例子。 Express v3.x不再使用partials。 请参阅查看维基中的系统更改 。 而是使用块和包括 。

在login时显示错误消息的简单方法是

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时设置errorvariables,也不会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')