【问题标题】:Best place to handle data validation with mongoose and express使用 mongoose 和 express 处理数据验证的最佳场所
【发布时间】:2013-12-26 06:06:59
【问题描述】:

也许这里没有明确的答案,但我想知道在处理 express.js 和 mongoose 时在哪里处理数据验证。以下哪项是最佳做法(我目前使用组合,开始感觉很笨拙):

  1. 模型(猫鼬)
  2. 控制器/路线(快递)

我读过的一些较早的帖子是:

但相互矛盾的答案只会增加混乱。也许它只是不明确,在这种情况下是一个更好的选择?

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    使用猫鼬时,我会将大部分的验证逻辑推送到猫鼬模型/模式。您可以使用mongoose-validator,它只是 node-validator 的一个包装器,用于简单的模型验证。如果您需要针对其他模型进行验证或更复杂的验证逻辑,您可以编写自己的自定义 mongoose 预验证或验证后挂钩 (see mongoose middleware)。

    使用 mongoose 验证模型时您获得的另一个好处是,mongoose 向您的模型添加了一个错误属性,可以通过model.errors[property] 访问该属性。此属性可用于验证 Web 上的错误消息或服务客户端。

    当编写更多/非常复杂的软件时,将验证与模型联系起来可能会成为一个问题。但是当它出现时,我会处理这个问题。由于 JavaScript 具有作为一等公民的功能,即使在这些复杂情况下,您的验证功能仍然可以重用。

    【讨论】:

      【解决方案2】:

      mongoose 验证器是从模型级别开始的好地方,但如果您需要进行特定于控制器的验证,我在 utils.js 文件中使用以下代码:

      var async = require('async')
      exports.validator = function (reqProps, props, mongoEnt, next) {
          var propsErr = [];
          var mongoErr = {};
      
          async.parallel([function (cb) {
              reqProps.forEach(function (rp) {
                  if (!props[rp])propsErr.push(rp);
              })
              cb()
          }, function (cb) {
              if (mongoEnt != null) {
                  var test = new mongoEnt(props);
      
                  test.validate(function (err) {
                      mongoErr = err;
                      cb();
                  });
              } else {
                  mongoErr = null;
                  cb();
              }
          }], function (err, result) {
              if (propsErr.length != 0) {
                      return next(new Error('The following props were not included: ' + propsErr));
              } else if(mongoErr != null) {
                      return next(new Error('The following prop was not included: ' +mongoErr.errors[Object.keys(mongoErr.errors).pop()].path));
              } else {
                  return next(null);
              }
          })
      }
      

      这使我既可以使用 mongoose 验证器进行验证,又可以在一行代码中检查我在 reqProps 属性中包含的其他道具。虽然这只是检查所需的属性,但您可以轻松地将其扩展为您自己的验证方案。

      此代码的使用示例:

      var Person = mongoose.model('Person')
      
      exports.addUSCitizen = function(props, next){ 
          utils.validator(['ssn'], props, Person, function (err) {
              if(err) return next(err);
              //do something using props.ssn
          })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        相关资源
        最近更新 更多