如何使用 Mongoose 删除中间件进行级联删除?
How to cascade delete using Mongoose remove middleware?
当 DELETE 请求发送到我的 API 时,我正在尝试删除架构的所有依赖项。删除没问题,但是应该清除依赖项的删除中间件似乎甚至没有被调用。
这是我的客户架构:
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 and Mongoose Docs (Mongoose Middleware) 但我还是不清楚。我不知道我遗漏了什么或做错了什么。
提前致谢!
编辑
这是my project's repository。请随时查看。
看来这是您关注的部分:
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 middleware are executed after the hooked method and all of its
pre middleware have completed. post middleware do not directly receive
flow control, e.g. no next or done callbacks are passed to it. post
hooks are a way to register traditional event listeners for these
methods.
我终于找到了解决办法。中间件没有触发,因为您必须在模型实例上使用 remove()
、save()
等,而不是模型本身。
示例:
Customer.remove({...});
不行。
Customer.findOne({...}, function(err, customer) {
customer.remove();
});
将工作并且将执行 Customer.post('remove')
.
中的任何操作
当 DELETE 请求发送到我的 API 时,我正在尝试删除架构的所有依赖项。删除没问题,但是应该清除依赖项的删除中间件似乎甚至没有被调用。
这是我的客户架构:
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 and Mongoose Docs (Mongoose Middleware) 但我还是不清楚。我不知道我遗漏了什么或做错了什么。
提前致谢!
编辑
这是my project's repository。请随时查看。
看来这是您关注的部分:
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 middleware are executed after the hooked method and all of its pre middleware have completed. post middleware do not directly receive flow control, e.g. no next or done callbacks are passed to it. post hooks are a way to register traditional event listeners for these methods.
我终于找到了解决办法。中间件没有触发,因为您必须在模型实例上使用 remove()
、save()
等,而不是模型本身。
示例:
Customer.remove({...});
不行。
Customer.findOne({...}, function(err, customer) {
customer.remove();
});
将工作并且将执行 Customer.post('remove')
.