在Mongoose中使用“ $ in”获取“超出最大调用堆栈大小”

时间:2019-01-23 02:28:24

标签: javascript mongoose

当我在Mongoose 5的 pre remove 中间件中尝试使用RangeError: Maximum call stack size exceeded$in时得到this

如果我将.where.inthis一起使用,不会出现此错误。

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通话。

1 个答案:

答案 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()导致了此问题。