我有 2 个不同的模型 User 和 Leave,我想对其进行设置,以便每当删除一个休假时,该休假也会从 User 文档中的一组叶子中提取。
用户模型:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const muv = require('mongoose-unique-validator');
const Leave = require('./leave');
const { ObjectID } = require('mongodb');
var schema = new Schema({
fullName: {
type: String,
required: true,
unique: true
},
leaveCredits: {
type: Number
},
filedLeaves: [{
type: Schema.Types.ObjectId,
ref: 'Leave'
}]
}, {
usePushEach: true
});
schema.plugin(muv);
schema.pre('remove', function (next) {
let user = this;
let toDelete = [];
user.filedLeaves.forEach(function(item) {
Leave.findByIdAndRemove(new ObjectID(item), (err, succ) => {
if (succ) {
console.log(`${item} Deleted`);
}
});
});
next();
});
module.exports = mongoose.model('User', schema);
离开模型:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const User = require('../models/user');
const { ObjectID } = require('mongodb');
var schema = new Schema({
userId: {
type: Schema.Types.ObjectId,
ref: 'User'
},
status: {
type: String,
required: true
},
start: {
type: String,
required: true
},
end: {
type: String,
required: true
},
type: {
type: String,
required: true
}
});
// makes sure that the removed date is also removed from the User's leave array
schema.pre('remove', function (next) {
let leave = this;
User.findById(new ObjectID(leave.userId), function (err, user) {
user.filedLeaves.pull(leave._id);
user.save();
});
next();
});
module.exports = mongoose.model('Leave', schema);
它一直给我一个错误 User.findById is not a function
但我很确定我已经将它们正确地导出为模型,因为除了我遇到的这个小问题之外我的整个应用程序都可以正常工作现在。
尝试谷歌搜索,但我看到的所有内容都没有帮助我解决这个问题。
编辑: 尝试仅使用 find() 但仍然抛出相同的错误,即它不是函数。
最佳答案
您遇到的问题是您的模式都需要另一个模式才能工作。这是一个循环需求问题。
要使其正常工作,您可以使用以下修复方法:
// makes sure that the removed date is also removed from the User's leave array
schema.pre('remove', function (next) {
const User = require('../models/user');
let leave = this;
User.findById(new ObjectID(leave.userId), function (err, user) {
user.filedLeaves.pull(leave._id);
user.save();
});
next();
});
schema.pre('remove', function (next) {
const Leave = require('./leave');
let user = this;
let toDelete = [];
user.filedLeaves.forEach(function(item) {
Leave.findByIdAndRemove(new ObjectID(item), (err, succ) => {
if (succ) {
console.log(`${item} Deleted`);
}
});
});
next();
});
只有当 pre
被调用时,我们才会提出要求。这避免了循环问题。
关于node.js - Mongoose :.findById 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50638168/