NodeJS一些模块不工作

我正在做一个与socket.io和nodejs的游戏,我做了一个叫做rooms.js的模块,这个模块需要users.js模块和fiveSocket.js模块,但是当我从主服务器文件中调用Rooms.New时,它说fiveSocket是未定义的,同样的问题,当Rooms.New调用一个users.js函数时,我得到了TypeError: Cannot read property 'getSocketIDbyId' of undefined

rooms.js:

 var mysql = require('../mysql/mysql.js'); var headers = require('./headers.js'); var users = require('./users.js'); var fiveSocket = require('./sockets.js'); var Rooms = { Obj: {}, Room: function(data) { var room = this; this.name = data.name; this.users = []; this.floorCode = data.floor; this.description = data.desc; this.maxUsers = data.maxUsers; this.owner = data.owner; this.setTime = new Date().getTime(); this.dbID = data.dbID; this.doorx = data.doorx; this.doory = data.doory; this.doordir = data.doordir; }, New: function(socketID, roomID) { var keys = Object.keys(Rooms.Obj).length; var id = keys + 1; var callback = function(row) { fiveSocket.emitClient(socketID, headers.roomData, { title: row.title, desc: row.description, mapStr: row.floorCode, doorx: row.doorx, doory: row.doory, doordir: row.doordir }); var uid = users.getIdBySocketID(socketID); users.Obj[uid].curRoom = roomID; var rid = Rooms.getIdByDbID(roomID); Rooms.Obj[rid].users.push(uid); } if(Rooms.getIdByDbID(roomID) != false) { var room = Rooms.getIdByDbID(roomID); var row = { title: room.name, description: room.description, floorCode: room.foorCode, doorx: room.doorx, doory: room.doory, doordir: room.doordir }; callback(row); } else { mysql.Query('SELECT * FROM rooms WHERE id = ? LIMIT 1', roomID, function(rows) { if(rows.length > 0) { var row = rows[0]; Rooms.Obj[id] = new Rooms.Room({name: row.title, floorCode: row.floorCode, desc: row.description, maxUsers: row.maxUsers, owner: row.owner, dbID: row.id, doorx: row.doorx, doory: row.doory, doordir: row.doordir}); callback(row); } }); } }, removeUser: function(DBroomID, userID) { var rid = Rooms.getIdByDbID(DBroomID); var room = Rooms.Obj[rid]; var index = room.indexOf(userID); if (index > -1) array.splice(index, 1); }, Listener: function(users) { setInterval(function(){ for(var roomID in Rooms.Obj) { var room = Rooms.Obj[roomID]; // send users coordinates room.users.forEach(function(uid) { var socketID = users.getSocketIDbyId(uid); var data = Rooms.getUsersInRoomData(roomID); fiveSocket.emitClient(socketID, headers.roomUsers, data); }); // unload inactive rooms (no users after 10 seconds) var activeUsers = room.users.length; var timestamp = room.setTime; var t = new Date(); t.setSeconds(t.getSeconds() + 10); var time2 = t.getTime(); if(activeUsers <= 0 && timestamp < time2) { Rooms.Remove(roomID); } } }, 1); }, getUsersInRoomData: function(roomID) { var room = Rooms.Obj[roomID]; var obj = {}; room.users.forEach(function(uid) { var user = users.Obj[uid]; obj[uid] = { username: user.username, position: user.position, figure: user.figure }; }); return obj; }, Remove: function(id) { delete Rooms.Obj[id]; }, getIdByDbID: function(dbID) { var result = null; for(var room in Rooms.Obj) { var u = Rooms.Obj[room]; if(u.dbID == dbID) var result = room; } if(result == null) return false; else return result; }, getDbIDbyId: function(id) { return Rooms.Obj[id].dbID; } } Rooms.Listener(); module.exports = Rooms; 

编辑:(如果可以帮助)

当我在主文件上的console.log fiveSocket 在这里输入图像描述

当我console.log fiveSocket在rooms.js文件 在这里输入图像描述

编辑2:当我已经删除var users = require('./users.js');fiveSocket ,当我console.log它在rooms.js它的作品,为什么?
编辑3:我仍然有问题

如果您需要其他模块来源:
Users.JS: http ://pastebin.com/Ynq9Qvi7
sockets.JS http://pastebin.com/wpmbKeAA

“房间”需要“用户”,反之亦然,所以你正试图执行“循环依赖”。

快速searchnode.js需要循环依赖提供了很多东西,例如:

“模块中的循环依赖关系可能比较棘手,而且很难在node.js中进行debugging。如果模块A在完成设置导出之前需要('B'),然后模块B需要('A'),如果没有设置A的导出,那么在B中要求它导致一个空的导出对象是合乎逻辑的,同样,debugging可能会很痛苦而对于那些习惯于自动处理这些循环依赖的开发人员来说,这并不是显而易见的,幸运的是,解决这个问题的方法相当简单。

或者如何处理Node.js中的循环依赖关系