如何为MongoDB的.deleteOne添加约束?现有预中间件代码异常求助
修改建议
问题根源
你的代码存在两个核心问题导致检查失效:
- 中间件钩子名称错误:Mongoose的预删除中间件正确名称是
deleteOne(驼峰命名),原代码写的deleteone无法被Mongoose识别,导致整个检查逻辑根本没执行,删除操作直接跳过验证。 - 查询ID获取错误:Mongoose默认文档主键是
_id而非id,原代码中query.id无法正确匹配到作者的主键,导致始终检测不到关联书籍,进而错误放行删除操作。
修改后的代码
authorSchema.pre('deleteOne', async function(next) { try { // 获取删除查询中的作者ID,兼容{ _id: xxx }或{ id: xxx }的查询条件 const authorId = this.getFilter()._id || this.getFilter().id; // 检查是否存在关联该作者的书籍 const hasBook = await Book.exists({ author: authorId }); if (hasBook) { next(new Error('This author still has books.')); } else { next(); } } catch (err) { next(err); } });
额外说明
- 如果你的
Book模型中关联作者的字段不是author,需要替换成实际的字段名。 - 若你使用的是
findByIdAndDelete方法,它底层会触发deleteOne中间件,所以上述修改同样适用。 - 建议在删除接口中捕获并处理这个错误,返回给前端明确的提示信息。
内容的提问来源于stack exchange,提问作者Deepika
相关产品推荐
相关产品推荐

