猫鼬虚拟填充无限循环

Posted

技术标签:

【中文标题】猫鼬虚拟填充无限循环【英文标题】:mongoose virtual populate infinite loop 【发布时间】:2020-05-18 08:31:03 【问题描述】:

我正在尝试使用与其相关的教程填充标签,当我在查询上使用 .populate() 时它可以工作,但是当我直接在模型上执行时,我有一个无限循环。

这是我的代码:

Tag.js

const mongoose = require("mongoose");

const tagSchema = new mongoose.Schema(
  
    name: 
      type: String,
      required: true,
      unique: true,
      trim: true
    
  ,
  
    toObject:  virtuals: true ,
    toJSON:  virtuals: true 
  
);

tagSchema.virtual("tutorials", 
  ref: "Tutorial",
  foreignField: "tags",
  localField: "_id"
);

tagSchema.pre(/^find/, function(next) 
  // That's the code that causes an infinite loop
  this.populate(
    path: "tutorials",
    select: "-__v"
  );

  next();
);

const Tag = mongoose.model("Tag", tagSchema);

module.exports = Tag;

教程.js

const mongoose = require('mongoose');

const tutorialSchema = new mongoose.Schema(
  title: 
    type: String,
    required: true,
    unique: true,
    trim: true
  ,
  tags: 
    type: [
      
        type: mongoose.Schema.ObjectId,
        ref: 'Tag'
      
    ]
  
);

const Tutorial = mongoose.model('Tutorial', tutorialSchema);

module.exports = Tutorial;

我想知道是什么导致了无限循环,为什么它对查询起作用,但对模型不起作用?谢谢!

编辑

这是有效的代码

Tag.js

const mongoose = require("mongoose");

const tagSchema = new mongoose.Schema(
  
    name: 
      type: String,
      required: true,
      unique: true,
      trim: true
    
  ,
  
    toObject:  virtuals: true ,
    toJSON:  virtuals: true 
  
);

tagSchema.virtual("tutorials", 
  ref: "Tutorial",
  foreignField: "tags",
  localField: "_id"
);

const Tag = mongoose.model("Tag", tagSchema);

module.exports = Tag;

教程.js

const mongoose = require('mongoose');

const tutorialSchema = new mongoose.Schema(
  title: 
    type: String,
    required: true,
    unique: true,
    trim: true
  ,
  tags: 
    type: [
      
        type: mongoose.Schema.ObjectId,
        ref: 'Tag'
      
    ]
  
);

const Tutorial = mongoose.model('Tutorial', tutorialSchema);

module.exports = Tutorial;

TagController.js

const Tag = require('./../models/tagModel');

exports.getAllTags = async (req, res) => 
  try 
    const docs = await Tag.find().populate(
      path: 'tutorials',
      select: '-__v'
    );

    res.status(200).json(
      // some code
    );
   catch(err) => 
    // some code
  
);

【问题讨论】:

你能添加这些代码吗? when I use .populate() on the query it works, but when I do it directly on the model I have an inifite loop. 当您更新问题时,请使用@SuleymanSah 标记我,以便通知我。 @SuleymanSah 感谢您的回答,我添加了您要求的代码 Sabrina 你能解释一下什么时候出现问题吗?显示导致错误的代码。我试图复制错误但没有成功。另外你能说出你用的是哪个猫鼬版本吗? @SuleymanSah 在标签模型中间件中填充导致无限循环的标签 你用什么版本的猫鼬?也是这个查询导致问题const docs = await Tag.find().populate( path: 'tutorials', select: '-__v' ); 【参考方案1】:

我最近遇到了同样的问题,花了很长时间才弄清楚,在我的例子中,两个查询相互填充并导致无限循环。

【讨论】:

以上是关于猫鼬虚拟填充无限循环的主要内容,如果未能解决你的问题,请参考以下文章

从 api 推送数组数据会导致无限循环

NSError.setUserInfoValueProvider 无限循环

使用后台并行无限循环 C# 读取缓冲区 [关闭]

即使没有进入无限循环,这段代码似乎也永远无法解决

Flutter 在无限循环中发送 http 请求

访问共享点网络应用程序:更新数据宏导致无限循环