2013-02-10 70 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

相關問題