【问题标题】:Node.js : TypeError: Converting circular structure to JSONNode.js:TypeError:将循环结构转换为 JSON
【发布时间】: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(房间);

标签: node.js typeerror


【解决方案1】:

换行:

    data.content.detail = (detail || {});

到:

    data.content.detail = detail || {};

我之前也遇到过类似的括号问题

【讨论】:

  • 恐怕这不是造成循环引用的原因。
  • RoomList 中存储了什么?
  • 我在 RoomList 中存储的是 RhythmRoom struct function RhythmRoom(id, title, password, songMd5, hostId, limit, status, memNum) { this.id = id; this.title = 标题 || ""; this.password = 密码 || ""; this.songMd5 = songMd5 || ""; this.hostId = hostId || ""; this.limit = 限制 || 0; this.status = 状态 || 0; this.memNum = memNum || 0; this.matchMd5 = ""; this.endTimer = null; this.member = []; };
  • 这是存储在成员中的内容: 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(房间);
猜你喜欢
  • 2016-01-11
  • 2017-04-03
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 2018-10-05
  • 2016-01-22
相关资源
最近更新 更多