首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >模型相互引用错误:循环依赖问题

模型相互引用错误:循环依赖问题
EN

Stack Overflow用户
提问于 2021-06-28 08:39:03
回答 2查看 533关注 0票数 3

admin.model.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import mongoose, { Schema, Document } from 'mongoose';
import UserRole, { IUserRole } from './user-role.model';

export interface IAdmin extends Document {
    role: IUserRole;
}

let adminSchema = new Schema<IAdmin>({
    role: {
        type: Schema.Types.ObjectId, ref: UserRole
    }
});

export default mongoose.model<IAdmin>('Admin', adminSchema);

user-role.model.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Schema, Document, model } from 'mongoose';

export interface IUserRole extends Document{
    updated_by: IAdmin|string;
}

let userRoleSchema = new Schema<IUserRole>({
    updated_by: {
        type: Schema.Types.ObjectId, ref: Admin
    }
})

export default model<IUserRole>('UserRole', userRoleSchema);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MongooseError: Invalid ref at path "updated_by". Got undefined
    at validateRef (/home/ess24/ess-smartlotto/node-rest/node_modules/mongoose/lib/helpers/populate/validateRef.js:17:9)
    at Schema.path (/home/ess24/ess-smartlotto/node-rest/node_modules/mongoose/lib/schema.js:655:5)
    at Schema.add (/home/ess24/ess-smartlotto/node-rest/node_modules/mongoose/lib/schema.js:535:14)
    at require (internal/modules/cjs/helpers.js:88:18)
[ERROR] 22:25:54 MongooseError: Invalid ref at path "updated_by". Got undefined

以下是我的两个模型--如何解决这类问题以及如何处理循环依赖关系?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-18 23:17:50

您必须将UserRoleAdminUserRole值放在''中,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const adminSchema = new Schema<IAdmin>({
    role: {
        type: Schema.Types.ObjectId, ref: 'UserRole' // Name of the model you are referencing
    }
});
let userRoleSchema = new Schema<IUserRole>({
    updated_by: {
        type: Schema.Types.ObjectId, ref: 'Admin' // <- and here
    }
})
票数 4
EN

Stack Overflow用户

发布于 2022-09-29 18:57:07

虽然@gabriel-lupu的上述回答是正确的,但在较新的版本中,似乎另一个修复方法是推荐

Fix:

  1. 添加引号:ref: 'UserRole' //推荐的第一个修复
  2. 添加箭头函数:ref: () => UserRole

Typegoose文档说明如下:

ref和type选项也可以在不使用() =>的情况下定义,但通常建议与之一起使用。如果不使用() =>,则在需要类(/变量)之后定义类(/变量)时可能会出现问题。由于参考文献一节。类在运行时加载和重新排序,这可能导致某些引用为null /未定义/不存在。这就是Typegoose提供以下内容的原因:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class Nested {
    @prop()
    public someNestedProperty: string;
   }

  // Recommended first fix:
  class Main {
    @prop({ ref: () => Nested }) // since 7.1 arrow functions can be used to 
    defer getting the type
    public nested: Ref<Nested>;
  }

  // Not recommended workaround (hardcoding model name):
  class Main {
    @prop({ ref: 'Nested' }) // since 7.0 it is recommended to use "console.log(getName(Class))" to get the generated name once and hardcode it like shown here
    public nested: Ref<Nested>;
  }

与上述示例一起使用的文档部分

Explanation:

MongooseError:路径"updated_by“处的无效引用。未定义的错误似乎是循环依赖造成的。

  • IAdmin有一个引用IUserRolerole属性。
  • IUserRole有一个引用IAdminupdated_by属性。
  1. admin.model.ts加载时,它会导入user-role.model.ts
  2. user-role.model.ts需要来自admin.model.tsupdated_by属性的IAdmin
  3. admin.model.ts还没有完成加载,因此导致了引用它的updated_by未定义。

Mozilla对模块如何处理循环依赖的相关解释。

在循环依赖项中,最终在图中有一个循环。通常,这是一个很长的循环。但是为了解释这个问题,我将使用一个带有短循环的人为的例子。

一个复杂的模块图,在左边有一个4个模块循环。一个简单的2模块循环在右边。 让我们看看如何与CommonJS模块一起工作。首先,主模块将执行到require语句。然后它将去加载计数器模块。

一个commonJS模块,在请求语句之后从main.js导出一个变量到依赖于该导入的counter.js 然后,计数器模块将尝试从导出对象访问消息。但是,由于尚未在主模块中对其进行评估,这将返回未定义的结果。JS引擎将为局部变量分配内存空间,并将值设置为未定义的值。

消息变量将被初始化并添加到内存中。但是,由于两者之间没有连接,所以它将在所需模块中保持未定义。

如果使用活动绑定处理导出,计数器模块最终会看到正确的值。在超时运行时,main.js的评估应该已经完成并填充了值。模块导入的工作方式

两者都有?修复似乎创建了一个活绑定

闭包也可以关闭导入的值,这些值被视为活动绑定,因为当原始值发生变化时,导入的值也相应地发生变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// closureCreator.js
import { x } from "./myModule.js";

export const getX = () => x; // Close over an imported live binding

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68167071

复制
相关文章
关于 循环引用问题
多个对象相互持有,A对象强引用B对象,同时B对象也强引用于A对象,两者相互等待对方发消息告诉自己需要Release,一直等待,形成闭环,内存无法释放,导致内存泄露。
honey缘木鱼
2019/12/20
3.3K0
关于 循环引用问题
fastjson 重复引用和循环引用问题
数据传输使用json格式再方便不过了。 fastjson 由阿里巴巴那伙人使用Java语言编写,号称最快的JSON库 前两天遇到一个问题 后台的数据转化为json字符串后发送到前台出现了$ref字样的东西,后来明白了这是引用,在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用的形式. 说到引用分为两种,重复引用和循环引用
Mshu
2018/10/31
2.6K0
PHP 循环引用的问题
问题 为了引出问题, 先来看下面一段代码: <?php $arr = [ 'a', 'b', 'c', 'd', ]; foreach ($arr as &$each){ e
烟草的香味
2019/07/25
3.7K0
PHP 循环引用的问题
Spring循环依赖问题修复
拆分的时候,把错误都处理完后,准备把工程起起来,发现弹簧的循环依赖问题。具体问题如下
端游岚
2018/12/19
3.5K0
Spring循环依赖问题修复
Golang代码循环依赖问题
其实就 package A 引入了 package B ,然后 package B 又引入了 package A ,因此形成了循环依赖。
王小明_HIT
2021/12/02
1.2K0
Golang代码循环依赖问题
python模块循环引用导致问题
这个问题遇到几次了,代码写多了之后,莫名其妙报错。现在终于知道了是因为循环引用的问题。重现一下:
py3study
2020/01/15
7360
python循环引用带来的MemoryError错误解决
在工作中,有一天django服务开始报错MemoryError的错误,没有遇到过这样的错误,上来之后还是很蒙蔽的,问了几个业内的人,他们 都给我说让我改服务器里面配置的东西, 因为是要给大家用的,服务器要保证长久运行,不能临时去修改这个,导致在大家无法使用平台呢,我想着是一个服务启动的时候 引发的,短暂的停服后,并没有解决掉这个问题。还是依旧存在,如果用命令去释放,只会短暂的解决。自己刚开始 也没有想到gc模块,在百度搜索, 找半天 终于找到了,知乎的链接,大概的方式就是用gc 直接去处理。
雷子
2021/03/15
1.5K0
解决循环依赖问题:优雅处理依赖关系的技巧
在软件开发中,依赖是不可避免的。我们经常需要在应用程序的不同组件之间建立依赖关系,以实现功能的模块化和复用。然而,有时候依赖关系可能变得复杂,甚至导致循环依赖的问题。在本文中,我们将通过项目中实际遇到的异常探讨一些解决循环依赖问题的技巧,帮助你在开发过程中优雅地处理依赖关系。
修己xj
2023/08/25
8650
解决循环依赖问题:优雅处理依赖关系的技巧
小记 TypeScript 中的循环引用问题
平时编写 TypeScript 代码时,一般都倾向于使用模块(Module),通过结合使用 import 和 export 我们便可以方便的进行模块的导入和导出.
用户2615200
2020/10/15
5.8K0
iOS常见的内存问题——循环引用
小编在这段儿时间测试过程中发现了好多内存问题,其中较大部分都是由于循环引用造成的内存泄漏,这里小编就借此类问题来给大家分享一下循环引用引发的原因及常见解决方案。
用户5521279
2019/12/10
1.8K0
iOS常见的内存问题——循环引用
Python 实战项目解决循环依赖问题
由于我在 Python 领域还是个初学者,没有遇到类似问题,但是根据分析,问题应该是出在了 循环依赖。
宋天伦
2023/10/20
4140
Python 实战项目解决循环依赖问题
由于我在 Python 领域还是个初学者,没有遇到类似问题,但是根据分析,问题应该是出在了 循环依赖。
宋天伦
2023/10/20
2350
Spring如何解决循环依赖问题
(1)通过构造方法进行依赖注入时产生的循环依赖问题。 (2)通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。 (3)通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。 在Spring中,只有第(3)种方式的循环依赖问题被解决了,其他两种方式在遇到循环依赖问题时都会产生异常。这是因为:
红目香薰
2022/11/29
8500
Spring 如何解决循环依赖问题?
这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。
Java技术栈
2019/11/28
1.6K0
Spring 如何解决循环依赖问题?
三探循环依赖 → 记一次线上偶现的循环依赖问题
Spring 的循环依赖,源码详细分析 → 真的非要三级缓存吗 中讲到了循环依赖问题
青石路
2022/05/10
8410
三探循环依赖 → 记一次线上偶现的循环依赖问题
通过循环引用问题来分析Spring源码
本文主要分析Spring的循环依赖问题。开始正文之前,我们需要定义这2个类。LoopReferenceA中引用LoopReferenceB,LoopReferenceB中引用LoopReferenceA。
用户2032165
2018/09/03
1.4K0
通过循环引用问题来分析Spring源码
Spring中解决循环依赖报错的问题
当一个ClassA依赖于ClassB,然后ClassB又反过来依赖ClassA,这就形成了一个循环依赖:
Happyjava
2019/07/16
2.9K0
Spring中解决循环依赖报错的问题
iOS循环引用
iOS循环引用 当前类的闭包/Block属性,用到了当前类,就会造成循环引用 此闭包/Block应该是当前类的属性,我们经常对Block进行copy,copy到堆中,以便后用。 单方向引用是不会产生循环引用。需要self引用闭包/Block,Block中使用self。 有两个规则: 如果你是通过引用来访问一个实例变量,那么将强引用至self。 如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量。 Object-C Block循环引用情况 一般来说我们总会在设置Block之后,在合适的时间
用户1941540
2018/05/11
7980
面试题:Spring 的循环依赖问题
# [Spring 的循环依赖问题](https://www.cnblogs.com/mghio/p/15024461.html)
程序员黄小斜
2021/12/06
5330
循环依赖 之 手写代码模拟spring循环依赖
如上图: A依赖了B, B同时依赖了A和C , C依赖了A. 这也是循环依赖. , 形成了一个闭环
用户5546570
2020/11/12
7960
循环依赖 之 手写代码模拟spring循环依赖

相似问题

循环依赖关系-结构和函数指针相互引用

211

Django模型相互引用

15

C++类相互依赖,导致循环依赖错误

45

相互使用的类的循环引用问题

38

具有相互引用/循环依赖的类的复制构造函数

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文