循环依赖检测到猫鼬错误

Posted

技术标签:

【中文标题】循环依赖检测到猫鼬错误【英文标题】:cyclic dependency detected error with mongoose 【发布时间】:2021-01-23 10:02:41 【问题描述】:

我有一个“套接字”模型的架构,当我尝试在猫鼬中保存任何创建的套接字对象时,它给了我一个模糊的错误 Error: cyclic dependency detected 仅标记 node_modules 而没有我的文件。架构代码如下。我保存socket对象的方式也如下。如果可能,请指出错误。

socket.js 文件

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const SocketSchema = new mongoose.Schema(

    _id: Schema.Types.ObjectId,
    socket_object: Schema.Types.Mixed,
    socket_id: Schema.Types.Mixed,

// other model links
    room_link:  type: Schema.Types.ObjectId, ref: 'Room' ,
)

SocketSchema.pre('save', function(next) 
    this.socket_id = this.socket_object.id;
    next();
);

// SocketSchema.set('autoIndex', false);

mongoose.model('Socket', SocketSchema);

我如何保存套接字对象:

let newSocket = new Socket(
    _id: new mongoose.Types.ObjectId(),
    socket_object: socket,
);      

console.log('-----------------NEW SOCKET---------------')
console.log(newSocket)

newSocket.save(function(err, newSocket)
    if (err) 
        console.log('--------------------LOG SOCKET NOT SAVED------------------------')
        return console.log(err)
    
)

只要我运行上面的代码,我就会得到底部模糊的错误

错误:检测到循环依赖 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:333:34) 在serializeInto(/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:941:17) 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:347:18) 在serializeInto(/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:941:17) 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:347:18) 在serializeInto(/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:941:17) 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:347:18) 在serializeInto(/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:941:17) 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:347:18) 在serializeInto(/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:941:17) 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:347:18) 在serializeInto(/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:941:17) 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:347:18) 在serializeInto(/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:727:17) 在 serializeObject (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:347:18) 在serializeInto (/home/arsalan/Work_stuff/Full_stack_apps/NATIVE_APPS/webRTC_fresh/webRTC_fullstack/web/node_modules/bson/lib/bson/parser/serializer.js:941:17)

如果可能,请指出错误。

【问题讨论】:

【参考方案1】:

Socket 对象是系统对象。它提供对主机操作系统提供的底层网络功能的访问。

您正在尝试将其保存到您的数据库中。你不能那样做™。您的对象包含状态 - 在 TCP 套接字的情况下与另一台机器的连接状态 - 如果您稍后尝试检索保存的对象,则根本无法恢复。如果您以后想使用类似的套接字,则必须对其进行重构。

而且,这些类型的系统对象具有相互指向的子对象。这就是使它们成为圆形的原因。这使他们更有效率。序列化最适合directed acyclic graphs 的数据结构。

对于基于 websocket 的应用程序,我需要类似的功能。我为它提供了Set 的套接字对象,以便在 RAM 中跟踪它们。打开套接字后,我做了socketSet.add(socket)。删除它后,我做了socketSet.delete(socket)。而且,当我需要查看所有打开的套接字时,我使用了socketSet.foreach()

Socket.io 提供了发出 messages to whole rooms 或单个连接的方法。

【讨论】:

那么你有什么建议呢?我应该在 RAM 中保留套接字吗?我正在创建像 WhatsApp 这样的聊天应用程序,所以对这种情况有什么建议吗?我知道我无法将此对象保存到我的数据库中,但请给我一些出路。谢谢 您想通过将 Socket 对象保存到数据库中来做什么?当您检索它们时,您希望如何处理它们?因为在 nodejs(或任何地方的任何 TCP/IP 应用程序)中保存 Sockets 没有意义,所以很难从示例代码中猜出您要尝试做什么。 如果您已经在使用连接,则可以将其存储在 redis 中有一个库可以将会话存储在 redis 中,可以为您完成此操作 我的目标是为房间中的用户保存套接字,以便我可以对它们调用 socket.emit。让我检查一下redis 我已经检查了redis,你能指出哪些特定的库在redis中存储会话吗?

以上是关于循环依赖检测到猫鼬错误的主要内容,如果未能解决你的问题,请参考以下文章

在 mongoose + nodeJS 中检测到循环依赖

如何解决使用 Angular 4 检测到的循环依赖?

spring-循环依赖

检测到循环依赖中的警告 - Angular Cli

自动加载常量时检测到循环依赖(Rails 4、Ruby 2)

激活 Autofac .NET Core Web API 时检测到循环组件依赖项