1

ユーザーモデルのユーザー名フィールドの一意性を検証するためにマングースを使用しようとしています

User.schema.path('username').validate(function(value, done) {
  User.findOne({username: value}, function(err, user) {
    if (err) return done(false);
    if (user) return done(false);

    done(true);
  });
}, "exists");

これは、新しいユーザーを作成するときにうまく機能します。ただし、ユーザー データを更新すると、検証に失敗します。基本的に、同じユーザーを編集しようとしているため、検証に失敗します。IE でユーザー名 = bob を更新すると、検証メソッドが bob を見つけて失敗します。

私はそのフィールドのモデルに unique: true を持っているので、mongodb は私のマングース検証なしでそれをうまく検証します。

var UserSchema = new Schema({
    username: { type: String, required: true, unique: true },
    password: { type: String, required: true }
);

ただし、データを挿入できないことを mongo に教えてもらうことの問題は、意味のあるエラー メッセージを抽出してクライアントに送り返す優れた方法がないことです。つまり、「申し訳ありませんが、ユーザー名は既に存在します。新しいユーザー名を選択してください」

基本的に、これを回避するために考えることができる唯一の方法は、マングースが値だけではなく、検証しようとしている実際のオブジェクトをバリデーターに渡した場合です。次に、_id を比較できます。

if (current._id == new._id) //this is the same user don't fail validation on unique username
4

1 に答える 1

3

mongoose の一意性検証に適した mpn モジュールがあります: https://github.com/blakehaswell/mongoose-unique-validator

于 2013-12-14T10:33:58.687 に答える