循环依赖检测到猫鼬错误
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中存储会话吗?以上是关于循环依赖检测到猫鼬错误的主要内容,如果未能解决你的问题,请参考以下文章