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