Używanie modułów w modułach.

0

Cześć!
Przepraszam jeśli nie ten dział ale wydał mi się on najbardziej odpowiedni.
W ramach nauki piszę projekt na node.js. Na wstępnie zaznaczam że moduł rozumiem jako klasę i tak też go używam. Jeśli jest to błędne prosiłbym o wyjaśnienie czym w node jest odpowiednik klasy.
Mianowicie mój plan polega na tym aby w głównym pliku zaimportować wszystkie moduły a następnie używać ich w klasach. Niestety tu pojawiają się 3 problemy:

  1. Jak ponownie zaimportować moduł do modułu? Oczywiście mogę użyć require i podać ścieżkę jednak nie wydaje mi się aby było to eleganckie rozwiązanie. Czy istnieje w node jakiś rodzaj importów który pozwoli mi zadeklarować obiekt a następnie tworzyć nowe obiekty bez pobierania ich na nowo?

  2. Potrzebuję zrobić moduł loggera. Niestety operacje na plikach są wolne, więc mój pomysł jest aby w klasie loggera cały czas był "otwarty" plik a przez użycie czegoś w stylu Logger.write("treść"); wpisywana treść do tego pliku. Jednak przekazywanie instancji obiektu do kolejnych modułów jest według mnie mocno średnie ponieważ jeden moduł tworzy instancje drugiego, drugie instancje paru innych...

  3. Mam moduł Input który to w konstruktorze tworzy serwer websocketów, przy połączeniu tworzy kolejny obiekt który to musi zwrócić dane do modułu Output aby zwrócić dane do klienta. W output potrzebuję obiekt serwera aby odesłać dane. Oczywiście mógłbym przekazywać obiekt serwera do modułu który tworzy Input a następnie przekazać do Output, ale tak jak wcześniej jest to według mnie średnie rozwiązanie.

Z góry dziękuję wszystkim za odpowiedzi :)

0

Na wstępnie zaznaczam że moduł rozumiem jako klasę i tak też go używam.

Moduł a klasa to dwie zupełnie osobne sprawy - moduł może eksportować klasę, ale może też eksportować funkcję czy nawet pojedynczą wartość (lub kombinacje tych elementów).

Ad.1. Powiedzmy, że eksportujesz z modułu klasę:

class Example {}

module.exports = Example

No to jeżeli dobrze rozumiem to wystarczy zaimportować ją do zmiennej:

const Exapmple = require('some/path/Example')

const someObject = new Example()
const anotherObject = new Example()

Ad.2 Do logów możesz użyć sprawdzonego rozwiązania typu Bunyan lub Winston

Ad. 3 Pokaż kod, bo to Twoje mieszanie pojęć nijak nie pomaga w zrozumieniu tego co chcesz zrobić.

0

@Maciej Cąderek Nie dodałem że u mnie moduł zawsze eksportuje obiekt. Co do pytania pierwszego chyba źle mnie zrozumiałeś. W module tworzę obiekt. Następnie pobieram go przez require. Jednakże jeśli potrzebuję dany moduł w wielu miejscach za każdym razem muszę pisać require. Chodziło mi o mechanizm który pozwoli mi w jednym miejscu go pobrać, a w miejscach w których go używam bezpośrednio stworzyć nową jego instancje bez pobierania go na nowo.

Ad 3:
input.js

 var WebSocket = require("nodejs-websocket")
var Game = require("./game.js")

var Games = {}

function Input() {

	var server = WebSocket.createServer(function(conn) {

		Games[conn.key] = new Game(conn.key, server)

	 	conn.on("text", function(response) {
	 	 	Games[conn.key].message(response)
	 	})

	 	conn.on("close", function (code, reason) {
	 	 	
	 	})

	 	conn.on("connect", function(data) {
	 		console.log("connected")
	 	})

	}).listen(8001)
}

module.exports = Input;

game.js

var Output = require('./output.js')
var Player = require('./player.js')

function Game(key, server) {

	data = {
		'x' : '50',
		'y' : '50',
		'currentHealth' : '100',
		'maxHealth' : '100',
		'avalibleWeapons' : [1,2,3],
		'selectedWeapons' : '1',
		'defense' : '1'
	}

	this.player = new Player(data);

	this.output = new Output(server, key);

	this.loop();
}

Game.prototype.loop = function() {
	that = this;
	setInterval(function(){
		that.output.send(that.buildResponse())
	}, 1000 / 16)
}

Game.prototype.buildResponse() {
	
}


module.exports = Game;

output.js

function Output(server, key) {
	this.server = server;
	this.key = key;
}

Output.prototype.send = function(string){
	this.server.connections.forEach(function(conn) {
    	conn.sendText(string)
    })
}

module.exports = Output;

1 użytkowników online, w tym zalogowanych: 0, gości: 1