2013-12-09 8 views
7

ここには明確な答えはないかもしれませんが、express.jsとmongooseを扱う際のデータ検証をどこで処理するかを知りたいと思います。ベストプラクティス(私は現在の組み合わせを使用して、非常に不器用な感じ始めています)次のうちどれです:mongooseとexpressでデータ検証を処理するのに最適な場所

  1. モデル(マングース)
  2. コントローラ/ルート(表現)

私が読んだ古い記事のいくつかは次の通りです:

しかし、紛らわしい答えが混乱の原因になります。たぶんそれは単に明確なカットではない、どちらの場合、より良い選択肢ですか?

答えて

5

mongooseを使用している場合、のの認証ロジックがmongooseモデル/スキーマにプッシュされます。簡単なモデルのバリデーションのためのnode-validatorのラッパーであるmongoose-validatorを使うことができます。バリデーションで他のモデルやより複雑なロジックを検証する必要がある場合は、独自のカスタムマングースを事前に作成したり、バリデーションフックを投稿したりすることができます(see mongoose middleware)。

mongooseを使用してモデルを検証すると、mongooseがmodel.errors[property]でアクセスできるモデルにエラープロパティを追加するという利点があります。このプロパティは、Webまたはサービスクライアントの検証エラーメッセージに使用できます。

モデルを検証するより複雑なソフトウェアを書くときに問題になることがあります。しかし、私はこの問題が発生したときにそれに対処します。 JavaScriptは第一級の市民としての機能を持っているため、これらの複雑な状況でも検証機能を再利用することができます。

4

マングースのバリデータはモデルのレベルで開始するには絶好の場所ですが、あなたは、コントローラ固有の検証を持っている必要があれば、私は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プロパティーにコードの1行に含める追加の小道具を確認してください。これは必須プロパティのチェックだけですが、独自の検証スキームで簡単に拡張できます。

このコードの使用の例:

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 
    }) 
} 
関連する問題