Node.js 如何使用Mongoose remove中间件级联删除?
当向API发送删除请求时,我试图删除模式的所有依赖项。删除是可以的,但是删除中间件(应该是用来清理依赖项的)似乎没有被调用 这是我的客户模式:Node.js 如何使用Mongoose remove中间件级联删除?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,当向API发送删除请求时,我试图删除模式的所有依赖项。删除是可以的,但是删除中间件(应该是用来清理依赖项的)似乎没有被调用 这是我的客户模式: var mongoose = require("mongoose"), Schema = mongoose.Schema, passportLocalMongoose = require('passport-local-mongoose'); var Order = require('./order'); var Customer = new Sche
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(),但我仍然不清楚。我不知道我错过了什么或做错了什么
提前谢谢
编辑
这是。请随便看看 这似乎是您关注的部分:
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中间件在hooked方法及其所有
预中间件已经完成post中间件不直接接收
流控制,例如,不向其传递下一个或完成的回调。邮递
钩子是为这些应用程序注册传统事件侦听器的一种方法
方法
我终于找到了解决办法。中间件没有启动,因为您必须在模型实例上使用
remove()
,save()
等,而不是模型本身
例如:
Customer.remove({…})代码>不起作用
Customer.findOne({...}, function(err, customer) {
customer.remove();
});
将工作,并将做任何在Customer.post('remove')
。。。我还添加了console.log(doc)
查看它是否到达函数,但没有。可能是函数根本没有执行。确保您在DELETE
请求中实际删除了客户。你们有什么版本的猫鼬?我有猫鼬4.0.2。删除请求一切正常;客户已被删除,但中间件不起作用。能否尝试使用Schema.pre('remove',fn)代码>而不是?这样我们就可以排除您的版本中的post
-hook是否已损坏。根据调查,他们在4.0.3中用post
hook修复了一些东西,尽管还不清楚他们修复了什么<代码>固定;sync post hook现在在函数之后正确调用了
对不起,我不知道什么是fn
。函数?当我这样做时,它会从集合中删除所有文档。在本例中,“客户”集合。有什么想法吗?这不是你想要的吗?不,这意味着只删除一个“Customer”实例,因此使用了“findOne”。但它会删除集合中的所有客户文档。。。好的,我知道你的意思。我上次的评论是错的。如果执行Customer.findOne()
并使用正确的筛选器,则它应该只返回一个文档,这将是唯一与您的筛选器匹配的文档。这里->我正在按一些参数进行过滤,然后,当找到一个参数时,中间件被触发->