我正在使用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.js
,users.js
和validation.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();
}
});
});
}
}
};