[Javascript] このMongoose独自の保存前検証で何が間違っていますか?


Answers

http://mongoosejs.com/docs/api.html#schematype_SchemaType-uniqueは方法です。 実際のMongoDbインデックスを使用して、フィールドが一意であることを確認します。 .preミドルウェアの必要はありません。

楽しい!

Question

私は一意のユーザー名を持つユーザーモデルを作成しようとしています。 そのコードは次のとおりです。

var mongoose = require("mongoose");

var Schema = mongoose.Schema;

var UserSchema = new Schema({
    username: String,
    password: String,
});

UserSchema.virtual("password_confirmation").get(function() {
    return this.pw_conf;
}).set(function(value) {
    this.pw_conf = value;
});

UserSchema.path("username").required(true);
UserSchema.path("password").required(true);

UserSchema.pre("save",function(next, done) {
    var self = this;
    mongoose.models["User"].findOne({username : self.username},function(err, user) {
        if(user) {
            self.invalidate("user","username must be unique");
        }
        done();
    });
    next();
});

UserSchema.pre("save",function(next) {
    if(this.pw_conf !== this.password) {
        next(new Error("Must specify the password confirmation"));
    }
    else {
        next();
    }
});

module.exports = mongoose.model("User",UserSchema);

私はまた、一意性が機能するかどうかを調べるためにテストしていました。

var User = require("./users"),
  mongoose = require("mongoose");
var u = new User();

mongoose.connect('mongodb://localhost/my_database');

u.username = "me";
u.password = "password";
u.password_confirmation = "password";
u.save(function(err) {
    if(err) {
        console.log(err);
    }
    mongoose.disconnect();
});

問題は、そうではありません。 コードを実行するたびに、新しいオブジェクトが作成されます。 一意性を保証する他の方法があるかもしれないことは承知していますが、私はこのようにしたいと思います。 findOneメソッドの結果を処理した後、私は呼び出しをdoneべきではありませんか? 私はnext間違って電話していますか?




非同期バリデータを使用してエラーをキャッチすることを検討しましたか?

UserSchema.path('username').validate(function (value, done) {
  User.count({ username: value }, function (error, count) {
    // Return false if an error is thrown or count > 0
    done(!(error || count));
  });
}, 'unique'); 





Links