首页 > 解决方案 > 'this' 在 Mongoose 中间件期间为空

问题描述

很长一段时间的 Java 程序员在这里试图弄清楚 Node.js

我正在尝试使用 pre 中间件将删除级联到子对象,但没有发生子删除,而父级删除顺利。让我的数据库充满悲伤的孤儿。当我开始登录控制台时,我看到对“this”的引用是空的。在大多数情况下,这似乎是使用 ==> 创建函数的问题,但我没有这样做:

游戏会话(父):

var mongoose = require('mongoose');
var TimeLineEvent = require('../models/timelineevent');

//Define a schema
var Schema = mongoose.Schema;

var GameSessionSchema = new Schema({
    name: {type: String, required: true},
    gameMasterId : {type: Schema.Types.ObjectId, ref: 'GameMaster', required: true},
});

GameSessionSchema.pre('findOneAndDelete', function(next) {
    console.log('GameSessionSchema.pre findOneAndDelete this ='+this);
    console.log('GameSessionSchema.pre findOneAndDelete id ='+this._id);
    TimeLineEvent.deleteMany({gameSessionId: this._id}).exec();
    next();
});

//Export function to create "SomeModel" model class
module.exports = mongoose.model('GameSessionModel', GameSessionSchema );

时间线事件(子):

//Require Mongoose
var mongoose = require('mongoose');

//Define a schema
var Schema = mongoose.Schema;

var TimeLineEventSchema = new Schema({
    name: {type: String, required: true},
    gameSessionId: {type: Schema.Types.ObjectId, ref: 'GameSession', required: true},
    time: {type: Number, required: true},
    nextAction: {type: Number}
});

module.exports = mongoose.model('TimeLineEventModel', TimeLineEventSchema );

这是调用 pre 方法时控制台显示的内容:

GameSessionSchema.pre findOneAndDelete this =[object Object]
GameSessionSchema.pre findOneAndDelete id =undefined

你能看到我错过了什么吗?谢谢!

标签: javascriptnode.jsmongoose

解决方案


来自文档:“在查询中间件功能中,this指的是查询。”

如果您使用console.log(this),您将能够查看完整的 Query 对象。您可能会找到this.model所需的参考资料。


推荐阅读