猫鼬 - " pre"和"发布"删除没有触发的中间件

时间:2015-12-25 17:18:35

标签: node.js mongodb mongoose middleware

我已经实现了两种不同的方式来删除用户,而其中没有一种方法可以触发" pre"和"发布"删除中间件。

据我了解

以下是我的模型文件中的两个不同实现:

方法一:

var User = module.exports = mongoose.model('User', userSchema);

userSchema.pre('remove', function(next) {
    // 'this' is the client being removed. Provide callbacks here if you want
    // to be notified of the calls' result.
    //Vouchers.remove({user_id: this._id}).exec();
    console.log("pre test");
    next();
});

userSchema.post('remove', function(next) {
    // 'this' is the client being removed. Provide callbacks here if you want
    // to be notified of the calls' result.
    //Vouchers.remove({user_id: this._id}).exec();
    console.log("post test");
    next();
});

// Remove User
module.exports.removeUser = function(id, callback){
    var query = {_id: id};
    console.log('test');
    //User.remove(query, callback);
    User.find(query).remove(callback);

}

方法二:

var User = module.exports = mongoose.model('User', userSchema);

userSchema.pre('remove', function(next) {
    // 'this' is the client being removed. Provide callbacks here if you want
    // to be notified of the calls' result.
    //Vouchers.remove({user_id: this._id}).exec();
    console.log("pre test");
    next();
});

userSchema.post('remove', function(next) {
    // 'this' is the client being removed. Provide callbacks here if you want
    // to be notified of the calls' result.
    //Vouchers.remove({user_id: this._id}).exec();
    console.log("post test");
    next();
});

// Remove User
module.exports.removeUser = function(id, callback){
    var query = {_id: id};
    console.log('test');
    User.remove(query, callback);
}

非常感谢任何建议。

6 个答案:

答案 0 :(得分:10)

这就是我把一切都运转起来的方式:

// Remove User
module.exports.removeUser = function(id, callback){

    User.findById(id, function (err, doc) {
        if (err) {

        }

        doc.remove(callback);
    })
}

//Remove vouchers related to users
userSchema.pre('remove', function(next) {
    this.model('Voucher').remove({ user: this._id }, next);
});

答案 1 :(得分:5)

http://mongoosejs.com/docs/middleware.html 请参阅文档。按照设计,Model.remove不会触发用于remove的中间件钩子,仅适用于ModelDocument.remove函数。

答案 2 :(得分:1)

其他人也在搜索相同的内容。 deleteOne和deleteMany中间件可以与之前和之后的中间件一起使用。最新的mongo版本不建议使用删除。

以下代码对我有用。

   ModelSchema.pre("deleteOne", { document: true }, function(next) {
      let id = this.getQuery()["_id"];
      mongoose.model("Model_two").deleteMany({ property: id }, function(err, result) {
        if (err) {
          next(err);
        } else {
          next();
        }
      });
    });

答案 3 :(得分:1)

您需要添加

{document:false,query:true}
userSchema('remove',callback)的{​​p> 1中间件的

参数。了解查询中间件和文档中间件之间的区别也很重要。

查询中间件和Query.remove()

如果

Query.remove()是查询中间件,则默认情况下不会将其触发。作为解决方案

UserSchema.pre('remove',callback)

我们将var User = module.exports = mongoose.model('User', userSchema); //... userSchema.pre('remove',{document:false,query:true}, callback); //... module.exports.removeUser = function(id, callback){ User.remove(callback); } 参数传递给中间件。

{document:false,query:true}

不会从数据库返回文档。它将执行删除操作,并且不会调用User.remove(callback)//Query.remove() 。它将调用doc.remove()

文档中间件和doc.remove()

Query.remove()默认注册为文档中间件

下面的代码段可以平稳运行,而无需其他参数。

userSchema.pre('remove',callback)

var User = module.exports = mongoose.model('User', userSchema); //... userSchema.pre('remove', callback); //... module.exports.removeUser = function(id, callback){ User.find(query).remove(callback);//doc.remove() } 将被解雇,因为userSchema.pre('remove',callback)从数据库返回猫鼬文档,而User.find(query)将调用User.find(query).remove(callback)

答案 4 :(得分:0)

对于以后遇到问题的任何人,请在调用mongoose.model()之前检查是否已定义钩子。

答案 5 :(得分:0)

仅文档中间件

if (grade >= 90)
{
   printf("A");
}

else if (grade >= 80)
{
    printf("B");
}

else if (grade >= 70)
{
    printf("C");
}

else if (grade >= 60)
{
    printf("D");
}

else if (grade >= 0)
{
    printf("F");
}

删除已被弃用,请尝试使用 deleteOne 代替。

仅查询中间件。这将在您执行 // query document and delete schema.findOne({ _id: id}).then((doc) => { doc.remove().then(() => { console.log(`it works!`) }) }) // schema schema.pre('remove', { document: true, query: false }, function() { console.log('Removing doc!') }) 而不是 Model.deleteOne() 时被调用。

doc.remove()