0

NodeJS/ExpressJS/MongoDB/Mongoose アプリ内でバリデーターとエクスプレスバリデーターを使用して、ユーザーが既に登録されているメールアドレスを使用していないことを確認しようとしています。私はすでに電子メール フィールドに一意のインデックスを持っていますが、私がやろうとしているのは、1 つの方法を使用してすべての検証を 1 つの場所に保持することです。したがって、私の質問: Express-validator を使用して一意性を検証します。

電子メール アドレスを検索するためのスキーマ メソッドを作成しましたが、機能しています。カスタムバリデーターを作成し、コントローラーに接続しました。それも機能しています。私の問題は、コールバックからのスキーマ メソッドの結果をコントローラーのバリデーターに伝える方法がわからないことです。

user.js (モデル)

...

/**
 * Check for email addresses already in the collection
 */
 checkEmailDupes: function(req, cb) {
   this.model('User').findOne({email: req}, function (err, user) {
     if (err) {
       return cb(err);
     }
     cb(null, user); // this is passing back the expected result
   });
},

...

users.js (コントローラー)

...
// The call to the custom validator (shown below)
req.assert('email', 'Email must be unique').checkEmailDupes(user);
...

// Check for email addresses that are already registered
expressValidator.Validator.prototype.checkEmailDupes = function(user) {
  user.checkEmailDupes(this.str, function (err, result) {
    if (err) {
      console.log('An error occurred in checkEmailDupes');
    }
    else {
      console.log('Found a user in checkEmailDupes');
      console.log(result); // this is producing the expected result
    }
  });
  return this.error(this.msg || 'Looks like this email address has already been registered');
  return this;
}

私は他のreturn this.error(this.msg...)場所に行く必要があることを知っています。理想的には、それをコールバックにスローしますが、それを行うと、

TypeError: オブジェクト # にはメソッド「エラー」がありません

4

2 に答える 2

0

最終的に、この方法を機能させることができませんでした。@robertklep と彼のフィードバックのおかげで、mongo から返されたエラー コード (電子メールで一意でない値が見つかった場合はMongoError: E11000 duplicate key error index) を使用し、それに基づいてエラー メッセージを設定することにしました。

最終的には次のようになります (ユーザー コントローラー内)。

user.save(function(err) {
  if (err) {
    // Instantiate the errors array
    var errors = [];

    // Email address already in DB
    if (err.code == 11000) {
      // Build the error object
      var error = {
        param: 'email',
        msg: 'The email address entered has already been registered',
        value: ''
      };

      // Push the error onto the errors array
      errors.push(error);
    }

    return res.render('users/signup', {
      errors: errors,
      user: user
    });
  }

  ...
于 2013-09-30T17:13:28.957 に答える