我想在我的应用中使用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);
};
当我尝试将某些内容发布到/ login时,我收到了以下错误消息:
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 :(得分:1)
只有在您要在路线中使用的任何中间件之后,才应使用app.router
:
app.use(express.methodOverride());
app.use(express.bodyParser());
app.use(express.urlencoded());
app.use(express.json());
app.use(expressValidator());
app.use(app.router);
原因是您使用Express声明中间件的顺序非常重要:如果在app.router
之前添加expressValidator
,则意味着路由器中间件将在验证器之前处理请求中间件甚至被调用,并有机会将其魔力添加到req
。
答案 1 :(得分:0)
我有同样的问题!您的 app.js 和 route.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,断言只是检查的别名。并且似乎有一个问题与#34;断言&#34;,可能会混淆nodejs,因为有一个名为&#34; assert&#34;的模块,只是猜测。 无论如何,似乎工作得很好。
希望它有所帮助!
答案 2 :(得分:0)
请通过将 assert 替换为 checkBody 进行检查。
req.checkBody('email', 'Email not valid').notEmpty().
这样做吧。