我正在尝试在向我的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。请随意调查。
答案 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方法之后执行的 预中间件已经完成。 发布中间件不直接接收 流量控制,例如没有下一个或完成的回调传递给它。岗位 钩子是一种为这些注册传统事件监听器的方法 方法