node.js - Mongoose :.findById 不是函数

标签 node.js express mongoose

我有 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/

相关文章:

javascript - 初始化类以访问方法

javascript - 为水平布局中的所有卡片设置相同的高度

node.js - 如何保存 Mongoose 虚拟

node.js - 有没有一种方法可以根据客户端、网络爬虫与网络应用程序客户端来呈现不同的页面?

javascript - Mongoose $inc 返回 "undefined is not a function"

javascript - 如何更新以对数组元素进行排序?

javascript - 查询比较对象数组

javascript - module.js 错误 :341 when trying to add android platform to ionic from command line

node.js - 通过将 useNewUrlParser 设置为 true 来避免 "current URL string parser is deprecated"警告

javascript - 自动从 Node.js API 导出到 TSV 或其他 Excel 兼容格式