24

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

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();
});

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

4

4 に答える 4

33

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

楽しみ!

于 2012-08-08T20:51:01.247 に答える
29

並列ミドルウェアを使用するには(nextおよびdoneパラメーターを使用)、2 番目のパラメーターとして渡す必要がありtrueます。

それ以上に、次の 2 つの可能性があります。

あなたのself.invalidate呼び出しは、"username"の代わりに参照する必要があり"user"ます。doneそれでも問題が解決しない場合は、保存操作を中止する場合にError オブジェクトを渡すことで、明示的に失敗させることができます。

UserSchema.pre("save", true, function(next, done) {
    var self = this;
    mongoose.models["User"].findOne({username: self.username}, function(err, user) {
        if(err) {
            done(err);
        } else if(user) {
            self.invalidate("username", "username must be unique");
            done(new Error("username must be unique"));
        } else {
            done();
        }
    });
    next();
});
于 2012-08-10T22:05:48.517 に答える
5

インストールと使用が非常に簡単な、mongoose 用の非常に優れたプラグインがあります。ドキュメントは優れており、初めて機能しました。

しかし、再保存には問題があります。

https://npmjs.org/package/mongoose-unique-validator

于 2013-10-02T10:32:56.453 に答える