Mongoose中findByIdAndDelete无法触发findOneAndDelete中间件
问题原因及解决方案
核心问题:Schema中间件添加顺序错误
你在创建Model之后才给customerSchema绑定findOneAndDelete的pre/post中间件,这会导致Mongoose无法识别这些中间件规则。Mongoose要求必须先完成Schema的所有配置(包括中间件、验证器等),再基于Schema创建Model。
修正步骤
- 调整代码顺序:先给
customerSchema添加所有中间件,再执行mongoose.model("Customer", customerSchema)创建Model - 修正pre中间件的打印文本(避免混淆):把pre里的"POST MIDDLEWARE"改成"PRE MIDDLEWARE",方便区分前后置中间件
修正后的完整代码
const mongoose = require('mongoose'); const { Schema } = mongoose; main().catch(err => console.log(err)); async function main() { await mongoose.connect('mongodb://127.0.0.1:27017/relationDatabase'); } const orderSchema = new Schema({ item: String, price: Number }); const Order = mongoose.model("Order", orderSchema); const customerSchema = new Schema({ name: String, orders: [ { type: Schema.Types.ObjectId, ref: "Order" } ] }); // 先绑定中间件,再创建Model customerSchema.pre('findOneAndDelete', async () => { console.log("PRE MIDDLEWARE"); }); customerSchema.post("findOneAndDelete", async () => { console.log("POST MIDDLEWARE"); }); // 基于配置完成的Schema创建Model const Customer = mongoose.model("Customer", customerSchema); async function deleteCustomer() { const deletedCustomer = await Customer.findByIdAndDelete("6644eb4bc7df9bee46d64981"); console.log(deletedCustomer); } let addCustomer = async () => { let cust1 = new Customer({ name:"john snow", }) let order1 = await Order.findOne({item:"burger"}); let order2 = await Order.findOne({item:"pasta"}); cust1.orders.push(order1); cust1.orders.push(order2); let res = await cust1.save(); console.log(res); } deleteCustomer();
补充说明
findByIdAndDelete是findOneAndDelete的封装方法,所以它会触发findOneAndDelete的中间件,修正顺序后即可正常执行- 确保MongoDB连接正常,且要删除的文档ID
6644eb4bc7df9bee46d64981确实存在,否则中间件可能因无匹配文档而不触发
内容的提问来源于stack exchange,提问作者Shreesha Rao
相关产品推荐
相关产品推荐

