NodeJS some modules do not work

I make a game with socket.io and nodejs and I create a module called rooms.js, this module requires the users.js and fiveSocket.js but when I call Rooms.New from the main server file, it says fiveSocket is undefined, same problem when Rooms.New calls Rooms.New function, I got 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; 

EDIT: (if that might be helpful)

When I console.log fiveSocket in the main file enter image description here

When I console.log fiveSocket in rooms.js file enter image description here

EDIT2: When I removed var users = require('./users.js'); from fiveSocket , when I console.log it in rooms.js works, why?
EDIT3: I still have a problem

If you need other modules, sources:
Users JS: http://pastebin.com/Ynq9Qvi7
.JS sockets http://pastebin.com/wpmbKeAA

+5
source share
1 answer

Numbers require Users and vice versa, so you are trying to do a circular dependency.

A quick search for node.js requires circular dependencies, gives many things, for example:

"Circular dependencies in modules can be complex and it is difficult to debug node.js. If module A requires ('B'), before it finishes tuning, it exports and then module B requires ('A"), it will return instead Or he might intend to export. This makes logical sense that if the export of A was not installed, requiring it to B leads to an empty export. However, it can be a pain of debugging, and not obvious to developers using these cyclic dependencies are processed automatically. Fortunately, there are fairly simple approaches to solving the problem. "

or How to work with circular dependencies in node.js

0
source

Source: https://habr.com/ru/post/1240808/


All Articles