mongoose .remove()不是函数,为什么nodejs不能识别我的方法?

vlurs2pr  于 2023-05-13  发布在  Go
关注(0)|答案(1)|浏览(195)

我正在使用nodejs和mongoose为bootcamp和courses制作一个API,它们之间的关系是一个bootcamp可能有很多courses。
现在我正试图删除级联,以便我删除一个训练营,所有相关的课程也应该被删除。
在我的模型Bootcamp中:

// Cascade delete courses when a bootcamp is deleted
BootcampSchema.pre('remove', async function(next) {
    console.log(`Courses being removed from bootcamp ${this._id}`);
    await this.model('Course').deleteMany({ bootcamp: this._id });
    next();
  });
  
  // Reverse populate with virtuals
  BootcampSchema.virtual('courses', {
    ref: 'Course',
    localField: '_id',
    foreignField: 'bootcamp',
    justOne: false
  });

bootcamps.js(控制器):

// @desc    Delete a Bootcamp
// @route   DELETE /api/v1/bootcamps/:id
// @access  Private

exports.deleteBootcamp = asyncHandler(async (req, res, next) => {
        const bootcamp = await Bootcamp.findById(req.params.id);
        if(!bootcamp) {
            return next(new ErrorResponse(`Bootcamp not found with id of ${req.params.id}`, 404));
        }

        bootcamp.remove();

        res.status(200).json({ success: true, data: {} });

})

所以我在Postman中发送请求,得到以下错误:bootcamp.remove is not a function
知道为什么会这样吗还有别的办法吗

qfe3c7zg

qfe3c7zg1#

我真的不知道remove()是否像你在评论中提到的那样被弃用,你的代码看起来很好。
如果你真的可以用await Bootcamp.findById(req.params.id)得到bootcamp,那么为你的类Bootcamp创建的模式就是正确的。
另一种选择是使用deleteOne()

await Bootcamp.deleteOne({id: req.params.id}); // or {_id: req.params.id} depending on the id field name in your schema

您还必须为此更新中间件:

BootcampSchema.pre('deleteOne', async function(next) { // replace 'remove' with 'deleteOne' 
    // your logic
  });

相关问题