快速验证器表示验证错误

时间:2014-02-17 21:02:27

标签: node.js express

我想在我的应用中使用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);

3 个答案:

答案 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().

这样做吧。