gpt4 book ai didi

node.js - 模型定义之前定义的中间件,级联删除失败,出现中间件被绕过

转载 作者:太空宇宙 更新时间:2023-11-04 01:01:43 27 4
gpt4 key购买 nike

这就是我的文件中的内容。我想要做的是,当删除 Author 文档时,他的所有 Book 文档也应该被删除。我最初尝试使用连接了错误处理程序的串行中间件,但没有记录任何错误,作者被删除,但他的书籍没有被删除。

然后我尝试了并行中间件,假设在所有预中间件完成之前不会触发 remove() 但事实似乎并非如此。 Author 仍被删除,但 Book 并未被删除,并且没有记录任何错误:

//...

var Book = require('./book-model'');

AuthorSchema.pre('remove', true, function(next, done) {
Book.remove({author: this._id}, function(err) {
if (err) {
console.log(err);
done(err);
}
done();
});
next();
});

AuthorSchema.statics.deleteAuthor = function(authorId, callback) {
var Author = mongoose.model('Author');
Author.remove({_id: authorId}, callback);
};

// ...

module.exports = mongoose.model('Author', AuthorSchema);

所以我认为中间件会被绕过,否则考虑到我尝试过的变体数量,我至少会看到一些错误来表明中间件确实被触发。不幸的是,我似乎无法指出我做错了什么。

请指教。

最佳答案

'remove' 中间件仅在调用 remove instance 方法 ( Model#remove ) 时运行,而不是在调用类方法 ( Model.remove ) 时运行。这类似于在 save 上调用 'save' 中间件的方式,但在 update 上则不调用。

因此,您需要将 deleteAuthor 方法重写为:

AuthorSchema.statics.deleteAuthor = function(authorId, callback) {
this.findById(authorId, function(err, author) {
if (author) {
author.remove(callback);
} else {
callback(err);
}
});
};

关于node.js - 模型定义之前定义的中间件,级联删除失败,出现中间件被绕过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26392043/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com