Как каскадное удаление с помощью 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



Этохранилище моего проекта . Пожалуйста, не стесняйтесь вникать.

874   2  

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

    Ничего не найдено.