2014-02-17 96 views
2

我想在我的應用程序中使用express-validator快速驗證錯誤與快速驗證程序

這裏是我的app.js代碼:

app.set('port', process.env.PORT || 3000); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
app.use(express.logger('dev')); 
app.use(express.methodOverride()); 
app.use(app.router); 
app.use(express.bodyParser()); 
app.use(express.urlencoded()); 
app.use(express.json()); 
app.use(expressValidator()); 

下面是我路線

module.exports = function(app) { 
    app.post('/login', userController.login); 
} 

這裏是我的登錄代碼:

exports.login = function(req, res, next) { 
    req.assert('email', 'Email not valid').isEmail(); 

    var errors = req.validationErrors(); 

    if (errors) { 
     return res.redirect('/login'); 
    } 

    passport.authenticate('local', function(err, user, info) { 
     // do stuff 
    })(req, res, next); 
}; 

當我嘗試發佈到/登錄我得到了follwoing錯誤信息的內容:

TypeError: Object # <IncomingMessage> has no method 'assert' 

我看到了,這可能涉及與app.use一個問題,但現在我卡住了...

編輯1: 我我app.use改變這些的,但它並沒有解決我的問題:

app.use(express.logger('dev')); 
app.use(express.methodOverride()); 
app.use(express.bodyParser()); 
app.use(express.urlencoded()); 
app.use(express.json()); 
app.use(expressValidator()); 
app.use(app.router); 
+0

我的壞...我在app.use()之前導入了我的路由文件,所以沒有考慮到所有中間件! –

回答

0

您應該只後你打算使用任何中間件使用app.router在您的路線:

的原因是,在聲明中間件Express中的順序是非常重要的:如果你expressValidator前加app.router,這意味着,路由器中間件將得到處理驗證之前請求中間件甚至被稱爲並有機會將其魔術添加到req

+0

我試圖把app.router放在我的app.use的末尾,但我仍然有同樣的錯誤:( –

0

我有同樣的問題!您app.jsroute.js代碼就好了,但在你的登錄代碼,你必須從改變:

req.assert('email', 'Email not valid').notEmpty(); 

和替換它:

req.check('email', 'Email not valid').notEmpty(); 

如果你看到上線198碼https://github.com/ctavan/express-validator/blob/master/lib/express_validator.js斷言僅供檢查的別名。而且似乎有一個與「assert」這個名字有關的問題,可能會讓nodejs感到困惑,因爲有一個名爲「assert」的模塊,這只是一個猜測。無論如何,它似乎工作得很好。

希望它有幫助!