当我在Mongoose 5的 pre remove 中间件中尝试使用RangeError: Maximum call stack size exceeded
和$in
时得到this
如果我将.where
和.in
与this
一起使用,不会出现此错误。
const UserSchema = new Schema({
name: String,
blogPosts: [{
type: Schema.Types.ObjectId,
ref: 'blogPost'
}],
});
UserSchema.pre('remove', async function() {
const BlogPost = mongoose.model('blogPost');
//This line throws the RangeError
await BlogPost.deleteMany({ _id: { $in: this.blogPosts } });
//This one works
await BlogPost.deleteMany().where('_id').in(this.blogPosts);
});
我在这里做错什么了?
编辑:
如果使用this
,如果我尝试console.log
this
会出现此错误,或者在这种情况下,当与{{一起使用时,this.blogPosts
1}}。
修改2: 在调试源代码时,我找到了收到此错误的原因。
这是因为我的$in
模式也引用了BlogPost
。它加载User
,然后User
加载User
,然后BlogPost
加载BlogPost
,依此类推,直到超出最大调用堆栈
我只是不知道为什么仅在某些情况下会发生这种情况,例如第一次User
通话。
答案 0 :(得分:1)
问题出在我的 app.js 文件中。
我创建了一个示例函数,该函数执行了所有的操作。
它正在做这样的事情:
const user = new User({...
const blogPost = new BlogPost({...
//saving, updating and retrieving...
user.remove();
最后一行是导致错误的原因,因此我用以下代码替换了user.remove()
:
const doc = User.findOne({});
doc.remove();
现在一切正常。
奇怪的是,使用与 new 模型相同的引用调用remove()
导致了此问题。