我写在Express.js的申请书,并与我在做所有我的验证的路径(或控制器,如果你喜欢)开始:
app.post('/register', function (req, res, next) {
// Generic validation
req.assert('name', 'Name is empty').notEmpty();
req.assert('username', 'Username is empty').notEmpty();
var errors = req.validationErrors(true);
if (errors) {
// If there are errors, show them
} else {
// If there are no errors, use the model to save to the database
}
});
不过,我很快就发现,我的验证应该在模型中发生的事情,保持内嵌“瘦控制器,胖模型”的原则。
模型:
var userSchema = new Schema({
name: {
type: String
, required: true
, validate: [validators.notEmpty, 'Name is empty']
}
, username: {
type: String
, required: true
, validate: [validators.notEmpty, 'Username is empty']
}
, salt: String
, hash: String
});
路线/控制器:
app.post('/register', function (req, res, next) {
var newUser = new User(req.body);
// Tell the model to try to save the data to the database
newUser.save(function (err) {
if (err) {
// There were validation errors
} else {
// No errors
}
});
});
这种运作良好。 不过,我需要做之前,数据库层验证。 举例来说,我需要检查,如果两个密码是相同的 ( password
和confirmPassword
)。 这不能在模式定义,因为我既省salt
及hash
在模型中。 因此,我需要在数据库层之前做到这一点的验证,在路由/控制器。 正因为如此,我将无法显示验证消息一起。
这是最好的办法的事情做的事情 - 在数据库层验证模型,以及控制器? 它是更好地拥有所有我的验证的控制器像以前一样? 但后来我将重复的代码,我保存到模型试。 或者我应该用另一种模式,如果有,是什么?