ExpressValidator-自定义验证器始终返回相同的错误

时间:2018-06-20 08:43:52

标签: node.js validation express express-validator

我正在使用ExpressValidator来验证我的应用中的POST数据。

我已声明一个名为isEmailAvailable的自定义验证规则,以检查是否已在数据库中找到电子邮件地址。无论值是多少,即使数据库中没有记录,它也会始终返回相同的错误消息:

{
"location": "body",
"param": "user.email",
"msg": "E-mail address already in use",
"value": ""
}

目录结构如下:

├── config
│   ├── index.js
├── helpers
│   └── validation.js
├── models
│   └── User.js
├── routes
│   ├── api
│   │   └── users.js
│   └── index.js
└── server.js

下面是我的server.jsusers.jsvalidation.js文件

server.js

const express             = require('express')
    , bodyParser          = require('body-parser')
    , mongoose            = require('mongoose')
    , config              = require('./config/index')
    , expressValidator    = require('express-validator')
    , customValidators    = require('./helpers/validation');

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(require('method-override')());

mongoose.connect(config.mongodb.url, {
    useMongoClient: true,
    promiseLibrary: require('bluebird')
});

require('./models/User');
app.use(expressValidator(customValidators));
app.use(require('./routes'));

var server = app.listen( process.env.PORT || 3000, function(){
    console.log('Listening on port ' + server.address().port);
});

users.js

const router            = require('express').Router()
    , mongoose          = require('mongoose')
    , User              = mongoose.model('User')
    , randtoken         = require('rand-token');

router.post('/users', function(req, res, next) {
    // validation
    req.checkBody('user.email', 'E-mail address already in use').isEmailAvailable();

    req.asyncValidationErrors().then(function() {
        // validation passes
        var user = new User();

        user.email = req.body.user.email;
        user.name = req.body.user.name;
        user.setPassword(req.body.user.password);
        user.activation_token = randtoken.generate(32);
        user.active = 0;

        return user.save().then(function() {
            // user is saved in the database
            res.status(200).json( { status: "OK" });
        });
    }).catch(function(errors) {
        if(errors) {
            // validation fails, print errors 
            return res.status(422).json(errors);
        }
    });
});

module.exports = router;

validation.js

module.exports = {
    customValidators: {
        // check if email is available
        isEmailAvailable: function (email) {
            return new Promise(function (resolve, reject) {
                User.findOne({ email: email }, function (err, user) {
                    if (err)
                        throw err;
                    if (user) {
                        reject();
                    } else {
                        resolve();
                    }
                });
            });
        }
    }
};

0 个答案:

没有答案