Как каскадное удаление с помощью Mongoose remove middleware?
Я пытаюсь удалить все зависимости схемы, когда запрос на удаление отправляется в мой API. Удаление идет нормально, но программа remove middleware, которая должна очистить зависимости, кажется, даже не вызывается.
Это моя схема клиента:
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" });
});
});
// (...)
Я посмотрел этот вопрос и Mongoose Docs ( Mongoose Middleware), но мне все еще неясно. Я не знаю, что я упускаю или делаю. неправильный.
Заранее спасибо!
EDIT
Этохранилище моего проекта . Пожалуйста, не стесняйтесь вникать.
2 ответов:
Я, наконец, нашел решение этой проблемы. Промежуточного не стреляют, потому что вы должны использовать
remove(),save(), и т. д. экземпляры модели, а не самой модели.Пример:
Customer.remove({...});не получится.Customer.findOne({...}, function(err, customer) { customer.remove(); });Будет работать и будет делать все, что находится в
Customer.post('remove').
Похоже, что это та часть, на которой вы фокусируетесь:
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(); });Из документов:
Post middleware выполняются после метода hooked и всех его до промежуточного завершения. после промежуточного не непосредственно получать управление потоком, например, никакие последующие или выполненные обратные вызовы не передаются ему . пост крючки-это способ регистрации традиционных слушателей событий для них. методы.
Comments