2013-07-13 11 views
10

私は検証のためにexpress-validatorを使用しています。私はデータベースにmongooseを使用していますが、それには検証機能も組み込まれています。どちらを使用すればよいか知りたいですか?Express-Validatorでの検証

また、エクスプレスバリデータの検証が並行しているかどうかを知りたいと思います。たとえば、このコードを取る:

req.checkBody('email', 'Invalid email').notEmpty().isEmail().isUnique(); 
req.checkBody('password', 'Invalid possword').notEmpty().len(8, 30); 
req.checkBody('first_name', 'Invalid first_name').notEmpty().isAlpha(); 
req.checkBody('last_name', 'Invalid last_name').notEmpty().isAlpha(); 
req.checkBody('dateofbirth', 'Invalid dateofbirth').notEmpty.isDate(); 

isUnique()メールが既に登録かいないされていない場合、それはとても検証するためにデータベースに照会し確認したカスタム検証メソッドです。上記のコードでは言及していませんが、データベース問合せがそれぞれに作成される複数のフィールドを検証する必要がある他の投稿リクエストはほとんどありません。

私は、上記のチェック方法をそれぞれ並列に実行することが可能かどうかを知りたかったので、それをより高速にすることができました。私は明らかに非同期のようにこれらを並列に実行するモジュールを使いたいと思うでしょう。私はすでにこれらのチェックメソッドが既に並行して実行されているかどうかを知りたいでしょうか?

これを理解してもらえますか?前もって感謝します。

答えて

10

express-validatorは、ブラウザ/クライアントによって渡された入力を検証するためのものです。 Mongooseの検証は、新しく作成された文書を検証することを目的としています。どちらも目的が異なるため、使用する必要のあるきれいな答えはありません。両方を使うこともできます。

検証の順序については、チェックは直列に実行されます。 async.parallel()を使用して、のように表示されるように、チェックは並行して実行されるようにすることができますが、チェックは同期的なので実際には行われません。

編集node-validator(従って、express-validator)は、文字列バリデータです。一意性のテストは文字列演算ではなく、データモデル上で動作するため、node-validatorを使用しないようにしてください(実際はとは思えません)。

代わりに、Mongooseのunique機能を使用して、電子メールアドレスがデータベース内で1回だけ発生するようにすることをお勧めします。あるいは

async-validateように、非同期動作をサポートするバリデータモジュールを使用します。

+0

を混合せずに、あなたが必要なすべてのデータと文字列の検証を行うことができるように非同期検証をサポートしていますか? async.parallel()を実行すると、同期しているのはなぜですか?私には、これらのバリデーションが行われた後にチェックするエラーを生成する関数だと思われます。私が正しければ、すべてのバリデーションが完了した後、パラレルを使用してエラーをチェックすることができます。 –

+0

'async.parallel'は、Express-validator-callsが非同期呼び出し(I/O)を並列化するだけです。どのようにエラーを処理するかについては、[関連ドキュメント](https://github.com/ctavan/express-validator#validation-errors)をチェックしてください(*すべてのバリデーションが完了した後にも*行われます)。 – robertklep

+0

これはエクスプレスバリデータまたはノードバリデータに問題がありますか?そのノードバリデーターは私がそれを修正することは非常に困難だと思うよりも?しかし、それが私が何かができることを望むよりもエクスプレスバリデーターでは。 –

6

mongodb unique制約とexpress-validatorを使用すると、少し複雑なエラー処理が発生します。異なる場所のエラーを分析し、レスポンスレスポンスの共通形式に変換する必要があります。 https://maketips.net/tip/161/validate-username-available-using-express-validator

結論:あなたが必要な場合は、私のウェブサイト上でこのコードで、合計の例を参照してください

router.use(expressValidator({ 
    customValidators: { 
     isUsernameAvailable(username) { 
     return new Promise((resolve, reject) => { 
      User.findOne({ username: username }, (err, user) => { 
      if (err) throw err; 
      if(user == null) { 
       resolve(); 
      } else { 
       reject(); 
      } 
      }); 
     }); 
     } 
    } 
    }) 
); 

... 
req.checkBody('username', 'Username is required').notEmpty(); 
req.checkBody('username', 'Username already in use').isUsernameAvailable(); 


req.asyncValidationErrors().then(() => { 
... 

: だから別のアプローチは、MongoDBの中で、このような値を持つレコードを検索するカスタム急行バリデータを作成しますexpress-validatorは、同様に、ユーザーの検証と低レベルのDBバックエンドの検証、私はそれらを並列に動作させることができないのはなぜ

関連する問題