在Express.js项目中验证的位置 - 在数据库层验证(re.Monoose)?

时间:2012-12-21 16:25:25

标签: node.js validation model-view-controller express mongoose

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

这很有效。但是,我需要在数据库层之前进行验证。例如,我需要check if two passwords are the samepasswordconfirmPassword)。这不能在架构中定义,因为我只在模型中保存salthash。因此,我需要在数据库层之前,在路由/控制器中进行此验证。因此,我将无法一起显示验证消息。

这是处理事情的最佳方式 - 在数据库层以及控制器中的模型中进行验证吗?像以前一样在控制器中进行所有验证是否更好?但后来我将重复代码,我再次保存到模型中。或者我应该使用其他模式,如果是,那又是什么?

1 个答案:

答案 0 :(得分:2)

我会考虑将验证逻辑移到模型中,但不要将模型视为数据库。该模型大于数据库。模型执行验证,如果验证通过则将数据保存到数据库,如果验证失败,则返回正确的消息,以便路由器可以呈现正确的错误消息。