【问题标题】:Mongoose pre.save() async middleware not working as expectedMongoose pre.save() 异步中间件未按预期工作
【发布时间】:2012-11-14 23:50:04
【问题描述】:

跟进来自:Mongoose unique validation error type

我将这个架构与来自 npm 的 mongoose 3.0.3 一起使用:

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() 仍将返回 MongoError: E11000 duplicate key error index 并且仅在此之后调用 console.warn()

在根据文档调用所有中间件done()之前,不应调用保存操作,我应该返回一个验证错误。

done() 的行为似乎没有按预期工作,

知道为什么吗?

【问题讨论】:

    标签: node.js validation mongodb mongoose


    【解决方案1】:

    您正在使用并行中间件回调函数(nextdone),但您没有在 schema.pre 参数中设置并行标志,因此它使用的是串行规则。

    所以要么在你的调用中包含并行标志:

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

    【讨论】:

    • 这适用于 Mongoose 的哪个版本?我找不到您在代码 sn-p 中使用的 schema.pre 的此并行签名的任何文档。
    • @PeterLyons 并行选项至少回到了 2.x。有关文档,请参阅 mongoosejs.com/docs/middleware.html
    • @JohnnyHK 我可以在 next() 中发送状态码吗?如果我想拒绝请求,那是不是将请求保存在数据库中,并发送状态码?有可能吗?
    猜你喜欢
    • 2015-01-31
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2019-04-19
    • 2020-03-04
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多