【发布时间】:2015-05-02 08:53:29
【问题描述】:
我知道这是关于循环引用。但我无法找出我的代码有什么问题。 以下是完整的错误信息:
TypeError: Converting circular structure to JSON
at Object.stringify (native)
at Object.DataModel.getDataData (/root/Rhythm-LvDong-Release/models/dataModel.class.js:46:26)
at SocketController.handle (/root/Rhythm-LvDong-Release/controllers/socketController.class.js:647:59)
at Object.SocketRouter.router (/root/Rhythm-LvDong-Release/routes/socketRouter.js:25:28)
at Socket.<anonymous> (/root/Rhythm-LvDong-Release/app.js:190:22)
at Socket.emit (events.js:107:17)
at onReceivePackData (/root/Rhythm-LvDong-Release/app.js:244:24)
at Socket.<anonymous> (/root/Rhythm-LvDong-Release/app.js:154:9)
at Socket.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:163:16)
/root/Rhythm-LvDong-Release/models/dataModel.class.js:45
console.log("TESTCASE1:" + detail);
以下是代码: 第一:dataModel.class.js:46:26
getDataData: function (dataType, detail) {
var data = {};
data.type = 'data';
data.content = {};
data.content.dataType = dataType;
if (detail == 0) {
data.content.detail = 0;
} else {
data.content.detail = (detail || {});
}
console.log("TESTCASE1:" + detail);
console.log(JSON.stringify(data));//46th line
return JSON.stringify(data);
};
第二个:socketController.class.js:647:59
var room = GetRoom(socket.roomId);
if (room == null)
break;
if (!SendMessage(socket.userId, DataModel.getDataData('RefreshRoom', room))) {//the 647th line
}
然后我调用了一些函数:
//SendMessage
function SendMessage(userId, message)
{
if (!streamSockets[userId])
return false;
streamSockets[userId].send(message);
return true;
}
//GetRoom
function GetRoom(roomId)
{
var room = null;
if (roomId >= 0) {
for (var i in RoomList) {
if (roomId == RoomList[i].id) {
room = RoomList[i];
break;
}
}
}
return room;
}
请帮我找出我的代码有什么问题。
【问题讨论】:
-
您在
RoomList中存储了什么?在我看来,detail(在您的代码之后是一个“房间”)可能会导致序列化问题。 -
RoomList我想可能有循环引用,这会导致问题 -
感谢您的回复。 RoomList 是一个存储 RhythmRoom 结构的数组。我这样创建房间: var room = new RhythmRoom(totalRoomNumber.get(), title, password, songMd5, socket.userId, limit, 0, 1); socket.roomId = totalRoomNumber.get(); totalRoomNumber.up(); var roomMember = new RhythmRoomMember(socket.userId, 0); room.member.push(roomMember); room.hostId = socket.userId; RoomList.push(房间);