2012-11-27 37 views
15

私はNPMからmongoose 3.0.3と、このスキーマを使用しています:マングース独自の検証エラータイプ

var schema = new Schema({ 

    _id: Schema.ObjectId, 
    email: {type: String, required: true, unique: true} 

}); 

私はDBにすでにある電子メールを保存しようとすると、私はValidationErrorかのようなrequired場を得ることを期待省略されています。しかし、これは事実ではない、私はMongoError: E11000 duplicate key error indexを得る。

これは検証エラーではありません(一意性を削除しても発生します:真)。

理由は何ですか?

+2

注:最新のnpm mongooseは週/月/年で無意味かもしれません。使用しているバージョンを入れてください。 – freakish

+2

alexjamesbrownのように、仕様がDB上にインデックスを作成するため、一意のものを削除した後も、それは続けました。そのDBとインデックスは、インデックスまたはDBを削除するまで保持されます。あなたはおそらくすでにそれを理解していたかもしれませんが、それを呼び出すことは誰かに役立つかもしれないと考えました。 – juanpaco

答えて

21

を、私はそれ私を入れ好む:ちょうど値をアサートされていないと、例えば番号)、あなたは事前にセーブイベントに配線する必要がありますです

UserSchema.path('email').validate(function(value, done) { 
    this.model('User').count({ email: value }, function(err, count) { 
     if (err) { 
      return done(err); 
     } 
     // If `count` is greater than zero, "invalidate" 
     done(!count); 
    }); 
}, 'Email already exists'); 

のようなn個のパスの検証メカニズムは、その後、それだけでValidationErrorに包まれますよ、あなたはvalidatesaveを呼び出すときに、最初の引数として返されます。

+0

これは正しい答えです。これは、パスのカスタム・バリデータであり、保存前機能ではありません。 – user3344977

+1

これは動作しますが、this.modelを使用すると、特定のシナリオでモデルのドキュメント/インスタンスを参照するのではなく、実際のモデル自体を参照することができます。すべてのシナリオを処理し、エラーを投げるのを避ける安全な方法は、代わりにmongoose.model( 'User'、UserSchema)を使用することです。 – user3344977

+0

これは私のために、ありがとうございます。 –

10

これが予想される動作

unique: trueはこのようにMongoDBでインデックスを設定することと同じです:

db.myCollection.ensureIndex({ "email": 1 }, { unique: true }) 

マングースを使用してこのタイプの検証を行うために(マングースがあなたIE-この複雑なvalidation-を呼び出します

mySchema.pre("save",function(next, done) { 
    var self = this; 
    mongoose.models["User"].findOne({email : self.email},function(err, results) { 
     if(err) { 
      done(err); 
     } else if(results) { //there was a result found, so the email address exists 
      self.invalidate("email","email must be unique"); 
      done(new Error("email must be unique")); 
     } else { 
      done(); 
     } 
    }); 
    next(); 
}); 
+0

あなたの方法を試しましたが、別の問題が発生しました:http://stackoverflow.com/questions/13582862/mongoose-pre-save-async-middleware-not-working-as-expected – Olivier

関連する問題