在数据库层(重新猫鼬。)验证 - 凡在Express.js项目验证?(Where to valida

2019-08-04 11:33发布

我写在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
    }
  });
});

这种运作良好。 不过,我需要做之前,数据库层验证。 举例来说,我需要检查,如果两个密码是相同的 ( passwordconfirmPassword )。 这不能在模式定义,因为我既省salthash在模型中。 因此,我需要在数据库层之前做到这一点的验证,在路由/控制器。 正因为如此,我将无法显示验证消息一起。

这是最好的办法的事情做的事情 - 在数据库层验证模型,以及控制器? 它是更好地拥有所有我的验证的控制器像以前一样? 但后来我将重复的代码,我保存到模型试。 或者我应该用另一种模式,如果有,是什么?

Answer 1:

我会考虑将验证逻辑模型,但停止模型作为数据库的思考。 该模型是比数据库越大。 该模型进行验证,如果验证通过它的数据保存到数据库中,如果验证失败则返回正确的消息,以便路由器可以使正确的错误消息。



文章来源: Where to validate in Express.js project – Validation at the database layer (re. Mongoose)?