【问题标题】:Mongoose Middleware pre 'remove' doesn't work, Model.update is not a functionMongoose Middleware pre 'remove' 不起作用,Model.update 不是函数
【发布时间】:2018-07-05 01:31:33
【问题描述】:

我为 Book 架构设置了一个中间件查询:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User= require('./user');

var schema = new Schema({

    name : {type: String, required:true},
    startDate: {type: Date},// UTC datetime
    endDate: {type: Date},// UTC datetime
    status: {type: String},
    user: {type: Schema.Types.ObjectId, ref: 'User'}
});


schema.post('remove', function(next) {

    User.update(
        { books: this._id},
        { $pull: { books: this._id } })
        .exec();
    next();
});

module.exports = mongoose.model('Book', schema);

如您所见,它会尝试从用户的图书列表中删除该图书。参考见User 架构(这个中的帖子查询顺便说一句):

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Book = require('./book');

var schema = new Schema({

    firstName: {type: String, required: true},
    lastName: {type: String},
    phone1: {type: String},
    phone2: {type: String},
    email: {type: String},
    address: {type: Schema.Types.ObjectId, ref: 'Address'},
    books: [{type: Schema.Types.ObjectId, ref:'Book'}]
});

schema.post('remove', function (user) {
    Book.findById({$in : user.books}, function (err, book) {
        if (err) {
            return res.status(500).json({
                title: 'An error occurred cascade delete operations for user',
                error: err
            });
        }

        if (book) {
            book.user= undefined;
            book.save();
        }

    });
});
module.exports = mongoose.model('User', schema);

我不断收到此错误,我在查询中尝试了许多变体但无济于事:

process.nextTick(function() { throw err; });
TypeError: User.update is not a function

有人可以帮帮我吗?

【问题讨论】:

    标签: node.js mongodb angular mongoose mongoose-middleware


    【解决方案1】:

    我认为您应该改用 .pre() 。希望这样的事情对你有用:

    bookSchema.pre('remove', function (next) {
    var book = this;
    book.model('User').update(
        { books: book._id }, 
        { $pull: { books: book._id } }, 
        { multi: true }, 
        next);
    

    });

    【讨论】:

    【解决方案2】:

    由于使用 require() 将每个模型导入另一个模型,这可能归结为循环依赖。

    尝试替换使用 require() 来导入您的模型:

    var User = require('./user')
    

    ...和:

    var Book = require('./book')
    

    相反,在你需要使用它的地方从 mongoose 获取模型,例如:

    mongoose.model('User').update(...)
    

    ...和:

    mongoose.model('Book').findById(...)
    

    另请注意,您可能需要在计划使用它们的文件中使用 require() 导入这两个模块,以便在使用前向 mongoose 注册这两个模型。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的解释,不知道循环依赖问题。你为我节省了很多时间!
    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2019-02-13
    • 1970-01-01
    • 2016-04-29
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多