Cree una copia de un módulo en lugar de una instancia en Node.js

esta sería mi primera pregunta sobre stackoverflow, espero que esto salga bien. He estado trabajando en un juego (usando corona SDK) y usé Node.js para escribir un pequeño servidor para manejar algunos mensajes de chat entre mis clientes, no hay problemas. Ahora estoy trabajando en expandir este pequeño servidor para hacer algo más, y lo que estaba pensando hacer es crear un archivo externo (módulo) que contenga un objeto que tenga todas las funciones y variables que necesitaría para representar una sala en mis juegos “Lobby”, donde 2 personas pueden jugar uno contra el otro, y cada vez que tengo 2 jugadores listos para jugar, creo una copia de esta sala vacía para ellos, y luego inicializo el juego en esa sala. . Así que tengo una matriz en mi archivo de proyecto principal, donde cada celda es una sala, y mi plan era importar mi módulo a esa matriz, y luego puedo iniciar el juego en esa “sala” específica, los jugadores jugarían, el juego continuará, y todo estaría bien … pero … mi código en main.js:

var new_game_obj = require('./room.js'); games[room_id] = new_game_obj(); games[room_id].users = [user1_name,user2_name]; 

Ahora, en mi habitación.js, tengo algo por el estilo:

 var game_logistics = {}; game_logistics.users = new Array(); game_logistics.return_users_count = function(){ return game_logistics.users.length; } module.exports = function() { return game_logistics; } 

Hasta ahora todo bien, y esto funciona bien, simplemente puedo ir:

 games[room_id].return_users_count() 

Y obtendré 0, o 1, o 2, dependiendo del número de usuarios que se hayan unido a esta sala. El problema comienza una vez que abro una nueva sala, ya que Node.js instanciará el módulo que he creado y no hará una copia de él, si ahora creo una nueva sala, incluso si eliminé y / o eliminé la sala anterior, Contará con toda la información de la sala anterior que ya he actualizado, y no una nueva sala limpia. Ejemplo:

 var new_game_obj = require('./room.js'); games["room_1"] = new_game_obj(); games["room_2"] = new_game_obj(); games["room_1"].users = ["yuval","lahav"]; _log(games["room_1"].return_user_count()); //outputs 2... _log(games["room_2"].return_user_count()); //outputs 2... 

Incluso haciendo esto:

 var new_game_obj = require('./room.js'); games["room_1"] = new_game_obj(); var new_game_obj2 = require('./room.js'); games["room_2"] = new_game_obj2(); games["room_1"].users = ["yuval","lahav"]; _log(games["room_1"].return_user_count()); //outputs 2... _log(games["room_2"].return_user_count()); //outputs 2... 

Da el mismo resultado, es la misma instancia del mismo módulo en todas las “copias” que hago de él. Así que mi pregunta es tan simple como eso, ¿cómo puedo crear una copia “limpia” de mi módulo original en lugar de crear una instancia una y otra vez y tener una sola habitación desordenada al final?

Lo que está haciendo es esto (reemplazar su llamada require() con lo que se devuelve);

 var new_game_obj = function() { return game_logistics; } 

Entonces, cada vez que llamas a new_game_obj , devuelves la misma instancia de game_logistics .

En su lugar, debes hacer que new_game_obj devuelva una nueva instancia de game_logistics ;

 // room.js function Game_Logistics() { this.users = []; this.return_users_count = function(){ return this.users.length; }; } module.exports = function() { return new Game_Logistics(); } 

Este es un gran cambio en la mentalidad. Verá que estamos utilizando new en Game_Logistics en module.exports para devolver una nueva instancia de Game_Logistics cada vez que se llame.

También verás que dentro de Game_Logistics , this se usa en todas partes en lugar de Game_Logistics ; esto es para asegurarnos de que estamos haciendo referencia a la instancia correcta de Game_Logistics lugar de a la función de constructor.

También he capitalizado su función game_logistics para cumplir con la convención de nomenclatura ampliamente seguida de que las funciones de constructor deben estar en mayúsculas ( más información ).

Se recomienda aprovechar la cadena de prototipos en JavaScript cuando se trabaja con múltiples instancias de funciones. Puede leer varios artículos sobre “herencia prototípica javascript * (por ejemplo, este ), pero por ahora, lo anterior cumplirá con lo que necesita.

Intereting Posts