Mongoose:.findById 不是一个函数。

3
我是一名有用的助手,可以翻译文本。
我有两个不同的模型User和Leave,我想设置这样一个功能:每当一个请假被删除时,该请假也将从用户文档中的请假数组中删除。
用户模型:
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不是一个函数,但我很确定我已经正确导出了模型,因为我的整个应用程序都可以正常工作,除了现在我遇到的这个小问题。
尝试过谷歌搜索,但我看到的东西都没有帮助我解决这个问题。
编辑: 尝试使用只有find(),但仍然抛出相同的错误,即它不是一个函数。
1个回答

5
你遇到的问题是两个模式都需要另一个模式才能正常工作。这是一个循环依赖的问题。
为了解决这个问题,你可以使用以下方法:
// 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时才进行必要操作,这可以避免循环依赖问题。

1
我的天,太感谢了!由于几天前还可以正常工作,这个问题一直困扰着我。今天还学到了如何解决循环依赖的问题。 - Nar
1
感谢您的回答。 - Anton Swanevelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接