2015-02-07 20 views
5

In uno dei miei file JS ne includo un altro. Come posso impostare le variabili nel modulo incluso?Come passare le variabili nei moduli NodeJS?

ho pensato di fare qualcosa di simile avrebbe funzionato

var mymodule = require('mymodule.js'); 
mymodule.myvariable = 'test'; 

E poi nel mymodule

this.myvariable === 'test'; 

Ma questo non funziona, è undefined. Quali sono le varie opzioni per il passaggio di un valore in un modulo? Potrei semplicemente aggiungere la variabile come parametro ad ogni funzione che chiamo in mymodule, ma non è l'ideale.

C'è un modo per farlo senza globali, in modo che io possa impostare le variabili in modo indipendente in vari moduli richiesti, come questo?

var mymodule1 = require('mymodule.js'); 
var mymodule2 = require('mymodule.js'); 
mymodule1.myvariable = 'test1'; 
mymodule2.myvariable = 'test2'; 
+0

Pensa all'ordine in cui sta accadendo, poi capirai cosa sta succedendo. –

risposta

13

NodeJS require() caricherà sempre il modulo una volta, quindi sarà necessario implementare l'ambito nel modulo in cui possono esistere diverse istanze del modulo con il proprio stato interno.

È possibile implementare il modulo come una classe di JS come:

var MyModule = function(){}; 

MyModule.prototype.someFunction = function(params){ 
    this.someVar = params; 
} 

MyModule.prototype.anotherFunction = function(key, value){ 
    this[key] = value; 
} 

module.exports = MyModule; 

Poi nel codice;

var MyModule = require('MyModule'); 

someModule = new MyModule(); 

// treat someModule like an object with its getters/setters/functions 
+0

Grazie, trattare un modulo come un oggetto era il concetto che mi mancava. Anche le altre 2 risposte qui sono state utili. – user779159

1

Dovrebbe funzionare bene. Ecco un esempio di lavoro:

index.js

var module = require('./module.js'); 
module.myvar = 'Hello world'; 
module.test(); 

module.js

module.exports = { 
    test: function() { 
     console.log('var is', this.myvar); 
    } 
}; 

tenere a mente se si utilizza this in una chiusura che l'ambito non è più il modulo si. Quindi questo potrebbe essere il tuo problema.

Puoi mostrarmi la parte del codice del modulo in cui la usi?

7

Il problema con quello che stavi facendo è che si imposta la variabile dopo l'importazione, ma this.myvariable === 'test'; era stato chiamato quando il modulo è stato importato, prima che la variabile è stata impostata.

È possibile fare in modo che il modulo esporti una funzione e quindi richiamare la funzione quando si importa, passando la variabile come argomento.

module.exports = function(myVar) { 
    var myModule = { 
    // has access to myVar 
    ... 
    }; 

    return myModule; 
}; 

Quando si importa,

var myModule = require('myModule')(myVar); 

Se si utilizza questo metodo, tenere a mente che si ottiene una diversa istanza del modulo, ovunque si importa, che non può essere quello che vuoi.

Se si desidera impostare i valori di un modulo dall'esterno del modulo, una buona opzione è quella di fare in modo che il modulo esporti un oggetto con un metodo setter e utilizzarlo per impostare il valore della variabile come proprietà dell'oggetto . Questo rende più chiaro che vuoi che questo valore sia impostabile, mentre solo fare myModule.myVar = può destabilizzarti in seguito.

module.exports = { 
    myVar: null, 

    setMyVar: function(myVar) { 
    this.myVar = myVar; 
    }, 

    ... 

}; 

In questo caso si accede alla stessa istanza del modello ovunque venga importata.

Modifica in risposta al commento

Nella prima opzione si mostra in cui si ottiene una diversa istanza ogni volta, come posso esportare più funzioni che ogni condividono lo stesso myVar? Se quel modulo esporta 5 funzioni ciascuna che ha bisogno di myVar, posso impostarlo in un posto come al momento dell'importazione piuttosto che passarlo in ogni funzione?

Non del tutto sicuro se ho capito quello che stai descrivendo, ma si potrebbe fare qualcosa di simile:

module.exports = function(myVar) { 
    var modules = {}; 
    modules.someModule = {...}; 
    modules.anotherModule = {...}; 
    ... 

    return modules; 
}; 

Ognuno di questi sotto-moduli avrebbero accesso allo stesso myVar. Quindi importeresti come sopra e il risultato sarebbe un oggetto contenente ciascuno dei tuoi cinque moduli come proprietà. Non posso dire se questa sia una buona idea, sta diventando piuttosto contorta, ma forse ha senso per la tua situazione.

+0

Nella prima opzione si mostra dove si ottiene ogni volta un'istanza diversa, come posso esportare più funzioni che condividono lo stesso 'myVar'? Se quel modulo esporta 5 funzioni ognuna delle quali ha bisogno di 'myVar', posso impostarla in un posto come al momento dell'importazione piuttosto che passarla in ogni funzione? – user779159

+1

Vedere la risposta modificata. –