2016-11-02 3 views
0

ユーザーが既に存在しているかどうか、またはカスタムエクスプレスバリデーターにない場合は、ブール値(trueまたはfalse)を戻すのに問題があります。 は、これまでのところ、私はこの方法でそれを動作するように管理します。約束やオブジェクトが、私は方法がわからないではない:express-validatorにcustomValidatorsのユーザーが既に存在していることを確認するにはどうすればよいですか?

app.use(expressValidator({ 
    customValidators: { 
     isUsernameAvailable: function (username) { 
      return User 
        .findOne({ 'username': username }) 
        .then(function (user) { 
         if (user) { 
          throw new Error('User already exist') 
         } 
        } 
     } 
    } 

アイデアは(isUsernameAvailable名を対応)ブールを返すことです。

私はこの方法でそれを確認するためにそれを使用:

module.exports = { 
    create: (req, res) => { 
     let user = req.body 

     ... 
     req.check('username', 'This username is already taken.').isUsernameAvailable() 
     ... 
    } 
} 

答えて

0

が、これはドキュメントにあります: Asynchronous Validation

+0

ありがとう、私は[非同期検証](https://github.com/ctavan/express-validator#asynchronous-validation)の例として正確に使用するようにしました。 2つの警告メッセージが表示されます。約束がエラーではなく[object object]で拒否され、約束がエラーで拒否されました:[object Array] –

0

ユーザー名がある場合は、あなたの「チェック」機能を知っているか説明していません重複しているかどうかはわかりませんが、私は、何らかの形のデータストア(データベースが最も一般的です)への旅行を必要としないスケーラブルなソリューションを考えることはできません。ノードでは、実際には同期をとることを本当に望んでいない限り、コールバックまたはプロミスを含む非同期コールを意味します。

正直なところ、一意の要件を持つマルチユーザーアプリケーションは、確認と作成の手順が1つのアトミックトランザクションに含まれないため、最終的に説明するようなチェックで問題になります。

データベース内のフィールドに一意のインデックスを適用するだけで、アプリケーションコード内で適切にエラーを処理することができます。

関連する問題