Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用Mongoose remove中间件级联删除?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 如何使用Mongoose remove中间件级联删除?

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

当向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" });
    });
});

// (...)
我确实看过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()
并使用正确的筛选器,则它应该只返回一个文档,这将是唯一与您的筛选器匹配的文档。这里->我正在按一些参数进行过滤,然后,当找到一个参数时,中间件被触发->