23

からのフォローアップ: Mongoose 固有の検証エラー タイプ

私はmongoose 3.0.3npmからこのスキーマを使用しています:

var schema = new Schema({

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

});

このミドルウェアを使用して、unique:true から validationError を取得します

schema.pre("save", function(next, done) {
    var self = this;

    model.findOne({email : this.email}, 'email', function(err, results) {
        if(err) {
            done(err);
        } else if(results) {
            console.warn('results', results);
            self.invalidate("email", "email must be unique");
            done(new Error("email must be unique"));
        } else {
            done();
        }
    });

    next();
});

しかし、うまくいきません!

Users.create()は引き続き aaMongoError: E11000 duplicate key error indexを返し、console.warn()その後のみ呼び出されます。

done()ドキュメントに従ってすべてのミドルウェアが呼び出されるまで、保存アクションは呼び出されるべきではなく、検証エラーが返されるはずです。

done()動作が期待どおりに機能していないように見えますが、

理由はありますか?

4

1 に答える 1

44

並列ミドルウェア コールバック関数を ( と の両方nextdone) 使用していますが、パラメーターに並列フラグを設定していないschema.preため、シリアル ルールを使用しています。

したがって、呼び出しに parallel フラグを含めます。

schema.pre("save", true, function(next, done) { ...

または、とにかく必要な場合は、シリアル ミドルウェア コールバック スタイルに切り替えます。

schema.pre("save", function(next) {
    var self = this;

    model.findOne({email : this.email}, 'email', function(err, results) {
        if(err) {
            next(err);
        } else if(results) {
            console.warn('results', results);
            self.invalidate("email", "email must be unique");
            next(new Error("email must be unique"));
        } else {
            next();
        }
    });
});
于 2012-11-27T13:40:37.687 に答える