1

次のように定義されたモデルがあります。

 
var userTableConfig = {
    username: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      validate: {
        len: [5, 30],
        is: ['[a-z0-9_]', 'i']
      }
    },
    email: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isEmail: true,
        len: [5, 30]
      }
    },
    ............. // Other fields
}

var userConfig =  userConfig = {
    underscored: true,
    instanceMethods: {
        ..............
    }
}

var User = seq.define('User', userTableConfig, userConfig);

このモデルを次のように使用すると:


    u = User.build();
    u.username = this.param('username');    // Contains empty string
    u.setPassword(this.param('password'));  // Contains empty string
    u.email = this.param('email');
    u.activation_state = 'pending';

    if (u.validate()) {
      console.log("Validation succeeded");
    } else {
      console.log("Validation failed");
      console.log(u.errors);
      .............
    }

長さの制約が満たされていないにもかかわらず、バリデーターは喜んで成功Validation succeededし、コンソールに表示されます。

さらに一歩進んで、正規表現の制約によって検証されるべきではない任意のランダムな文字をプッシュすることもでき、バリデーターはそれらも喜んで受け入れます。

そこで、バリデーターが実行されているかどうかを確認することにし、カスタム バリデーターを使用してそれを確認しようとしました。


  userTableConfig = {
    username: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      validate: {
        randomValidator: function() {
          console.log("===========> validator executed");
          throw new Error('Hell with validation');
          return false;
        },
        len: [5, 30],
        is: ['[a-z0-9_]', 'i']
      }
    },
    ......
  }

皮肉なことに、randomValidator メソッドは実行されますが、validate メソッドはエラーをスローしたり false を返したりすることなく成功します。

私が間違っているのは何ですか?上記の問題をどのように修正する必要がありますか?

4

1 に答える 1

3

私は問題が何であるかを理解しました:

validate メソッドは、検証が成功したかどうかを示すブール値を返しません。むしろ、フィールドに一致するハッシュの配列を、スローされたエラーの配列に返します。

したがって、真理値を次のようにチェックする代わりに:


if (u.validate()) {
      console.log("Validation succeeded");
    } else {
      console.log("Validation failed");
      console.log(u.errors);
      .............
    }

u.validate() によって返される配列の長さを確認する必要がありました。

これとは別に、Sequelize で非常に直観に反するのは (特に Rails から来た場合)、save が暗黙の検証を実行しないことです。

于 2012-12-11T05:08:29.810 に答える