2016-01-17 5 views
5

Ich bin ein Spiel mit socket.io und NodeJS machen, und ich bin ein Modul namens rooms.js machen, aber dieses Modul benötigt users.js Modul und fiveSocket.js Modul aber wenn ich rufe Rooms.New vom Haupt Server-Datei, es sagt, dass fiveSocket ist nicht definiert, das gleiche Problem, wenn Rooms.New ruft eine users.js Funktion, ich habe TypeError: Cannot read property 'getSocketIDbyId' of undefined

rooms.js:NodeJS einige Module nicht funktionieren

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: (wenn es hilfreich sein kann)

Als ich fiveSocket auf der Hauptdatei enter image description here

console.log Als ich console.log fiveSocket auf der rooms.js Datei enter image description here

EDIT2: Wenn ich var users = require('./users.js'); von fiveSocket entfernt habe, wenn ich console.log es in rooms.js funktioniert, wh y?
EDIT3: Ich habe immer noch das Problem

Wenn Sie die anderen Module Quellen benötigen:
Users.JS:http://pastebin.com/Ynq9Qvi7
sockets.JShttp://pastebin.com/wpmbKeAA

+0

Sie erfordern die gleiche Art und Weise in anderen Dateien fivesocket, die funktionieren? Auch Sie sind sicher, dass der Pfad korrekt ist? –

+1

Ja Der Pfad ist korrekt, da er sich im selben Verzeichnis befindet (rooms.js und fiveSocket.js befinden sich im selben Verzeichnis) –

+0

Ist fivesocket ein funktionales Objekt? Wie etwas, für das Sie neu anrufen müssen? –

Antwort

0

"Rooms" erfordert „Benutzer "und umgekehrt, also versuchen Sie eine" zirkuläre Abhängigkeit "durchzuführen.

Schnellsuche nach node.js zirkulären Abhängigkeiten erfordern gibt eine Menge Sachen, zum Beispiel:

„Zyklische Abhängigkeiten in Module können tückisch sein und hart in node.js. Wenn Modul A zu debuggen erfordert ('B'), bevor es fertig ist es Exporte, und dann Modul B erfordert ('A'), wird es wieder ein leeres Objekt statt was A exportiert haben soll.Es macht logisch Sinn, dass Wenn der Export von A nicht eingerichtet wurde, führt die Anforderung in B zu einem leeren Exportobjekt.Allerdings kann es ein Problem sein, zu debuggen und nicht inhärent offensichtlich für Entwickler, die gewohnt sind, diese zirkulären Abhängigkeiten automatisch zu behandeln. Glücklicherweise gibt es eher einfache Ansätze, um das Problem zu lösen.“

oder How to deal with cyclic dependencies in Node.js

+0

Danke für die Antwort, aber ich habe nicht verstanden, wie dieses Problem zu lösen, ich verstehe, dass ich den Code zu restrukturieren, aber ist da eine einfache Lösung, um das zu lösen? –

+0

Ich denke, der beste Weg ist, so viele Abhängigkeiten wie möglich zu entfernen. In perfekter Welt sollten Ihre "Räume" und "Benutzer" überhaupt keine Abhängigkeiten haben (außer einigen grundlegenden Mixins), aber notwendige Daten als Argumente erhalten. In JavaScript müssen Sie für den Zugriff auf Klassenmethoden keine "Klassen" -Definitionen angeben, sondern nur das Objekt bereitstellen und dessen Daten verwenden. Wie schon in "Listener: function (users) {" – zamuka

+0

Problem gelöst, danke ':)' Ich habe die Module in der Funktion bestanden –

Verwandte Themen