2016-01-17 12 views
5

Robię grę z socket.io i nodejs i robię moduł zwany rooms.js, moduł ten wymaga users.js moduł i fiveSocket.js modułu ale gdy zgłoszę Rooms.New z głównym serwer plików, to mówi, że fiveSocket jest niezdefiniowany, sam problem gdy Rooms.New wywołuje users.js funkcji, mam TypeError: Cannot read property 'getSocketIDbyId' of undefined

rooms.js:NodeJS niektóre moduły nie działa

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: (jeśli to może być pomocne)

Kiedy console.log fiveSocket na głównym pliku enter image description here

Kiedy console.log fiveSocket plik enter image description here

rooms.js

EDIT2: Kiedy usunąłem var users = require('./users.js'); z fiveSocket, kiedy I console.log to w rooms.js to działa, wh y?
Edit3: Nadal mam problem

Jeśli potrzebujesz źródła inne moduły:
Users.JS:http://pastebin.com/Ynq9Qvi7
sockets.JShttp://pastebin.com/wpmbKeAA

+0

Czy wymagająca fivesocket w ten sam sposób w innych plikach, które pracują? Również jesteś pewien, że ścieżka jest poprawna? –

+1

Tak w ten sam sposób, Ścieżka jest poprawna, ponieważ znajduje się w tym samym katalogu (pliki rooms.js i fiveSocket.js znajdują się w tym samym katalogu) –

+0

Czy fivesocket to obiekt funkcjonalny? Jak coś, co musiałbyś wywoływać jako nowy? –

Odpowiedz

0

"Pokój" wymaga „Użytkownicy "i na odwrót, więc próbujesz wykonać" zależność cykliczną ".

Szybkie wyszukiwanie node.js wymagają okrężne zależności daje wiele rzeczy, na przykład:

„Circular Zależności w moduły mogą być kłopotliwe i trudne do debugowania w node.js. Jeżeli moduł wymaga ("B") przed zakończeniem konfigurowania, a następnie moduł B wymaga ("A"), zwróci pusty obiekt zamiast tego, co A może zamierzał wyeksportować. To sprawia, że ​​ ma logiczne poczucie, że jeśli eksport A nie został ustawiony, wymaganie go w B powoduje pusty obiekt eksportu.Jednakże może być trudny do debugowania i nie jest oczywiste, że programiści mieli do czynienia z automatycznym przetwarzaniem zależności kołowych . Na szczęście istnieje raczej proste podejście do rozwiązania problemu.”

lub How to deal with cyclic dependencies in Node.js

+0

Dziękuję za odpowiedź, ale nie rozumiem, jak rozwiązać ten problem. Rozumiem, że muszę przeprowadzić restrukturyzację kodu, ale czy istnieje jakiekolwiek łatwe rozwiązanie tego rozwiązania? –

+0

Myślę, że najlepszym sposobem jest usunięcie tak wielu zależności, jak to tylko możliwe. W idealnym świecie twoje "pokoje" i "użytkownik" nie powinny mieć żadnych zależności (poza kilkoma podstawowymi składankami), ale otrzymują niezbędne dane jako argumenty. W JavaScript nie trzeba dołączać definicji "klasy", aby uzyskać dostęp do metod klasy, wystarczy podać obiekt i użyć jego danych. Tak jak już zrobiłeś w "Listener: funkcja (użytkownicy) {" – zamuka

+0

Problem rozwiązany, dziękuję ':)' Przekazałem moduły w funkcji –

Powiązane problemy