如何使用Mongoose删除中间件级联删除?

时间:2015-05-15 09:09:27

标签: node.js mongodb mongoose

我正在尝试在向我的API发送DELETE请求时删除架构的所有依赖项。删除没问题,但删除中间件(应该清理依赖项)似乎甚至没有被调用。

这是我的客户架构:

var mongoose = require("mongoose"),
Schema = mongoose.Schema,
passportLocalMongoose = require('passport-local-mongoose');

var Order = require('./order');
var Customer = new Schema({
    name: String,
    telephone: Number,
    address: String,
    email: String,
    seller: String
});

Customer.post('remove', function(next) {
    Order.remove({ customer: this._id }).exec();
    next();
});

Customer.plugin(passportLocalMongoose);

module.exports = mongoose.model("Customer", Customer);

这是我的客户路线:

var express = require('express');
var router = express.Router();
var passport = require('passport');
var isAuthenticated = require('./isAuthenticated');
var Customer = require('../models/customer');
var Order = require('../models/order');

// (...)

router.delete('/:customer_id', function(req, res) {
    Customer.remove({ _id: req.params.customer_id }, function(err) {
        if (err)
            res.json({ SERVER_RESPONSE: 0, SERVER_MESSAGE: "Error deleting", ERR: err });
        else res.json({ SERVER_RESPONSE: 1, SERVER_MESSAGE: "Customer deleted" });
    });
});

// (...)

我确实看过this question和Mongoose Docs(Mongoose Middleware),但我仍然不清楚。我不知道我错过了什么或做错了什么。

提前致谢!

修改

这是my project's repository。请随意调查。

2 个答案:

答案 0 :(得分:7)

我终于找到了解决方法。中间件没有被触发,因为你必须在模型实例上使用remove()save()等,而不是模型本身。

示例:

Customer.remove({...});无效。

Customer.findOne({...}, function(err, customer) {
  customer.remove();
});

将会运作,并会执行Customer.post('remove')中的任何内容。

答案 1 :(得分:1)

似乎这是你关注的部分:

Customer.post('remove', function(next) {
    Order.remove({ customer: this._id }).exec();
    next();
});

你在这里做的错误是post挂钩没有给出任何流量控制,所以next参数实际上不是一个函数而是文档本身。

将其更改为此,您应该得到您想要的内容:

Customer.post('remove', function(doc) {
    Order.remove({ customer: doc._id }).exec();
});

来自docs

  

post中间件是在hooked方法之后执行的   预中间件已经完成。 发布中间件不直接接收   流量控制,例如没有下一个或完成的回调传递给它。岗位   钩子是一种为这些注册传统事件监听器的方法   方法