You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连接正常,且要删除的文档ID6644eb4bc7df9bee46d64981确实存在,否则中间件可能因无匹配文档而不触发

内容的提问来源于stack exchange,提问作者Shreesha Rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:04:59