web-dev-qa-db-de.com

Freigabe und Änderung einer Variablen zwischen mehreren Dateien node.js

main.js

var count = 1;

// psuedocode
// if (words typed begins with @add)
require('./add.js');

// if (words typed begins with @remove)
require('./remove.js');

// if (words typed begins with @total)
require('./total.js');



module.exports.count = count;

total.js

var count = require('./main.js').count;
console.log(count);

add.js

var count = require('./main.js').count;
count += 10;
console.log(count);

remove.js

var count = require('./main.js').count;
count -= 10;
console.log(count);

console.log

 1
 11
 -9

Hintergrund:

Ich habe eine Anwendung (IRC-Bot), und ich möchte eine Funktion hinzufügen, die Peeps mit @add 1 oder @remove 1 ausführen können. Also würde add die Datei add.js auslösen, und dann müssten ('main.js') und 10 (zur Vereinfachung, es wird tatsächlich die Nummer parsen und diese Nummer verwenden) dazu addiert werden. Das Problem, das ich habe, ist, wenn jemand herumläuft und @remove macht. Es erfordert ('main.js') und subtrahiert 10 von 1, was -9 ergibt. Und @total würde 1 ausgeben. 

Ich habe ziemlich gut nach module.exports gesucht und bin nicht auf ein Beispiel wie das oben aufgeführte gestoßen. Die Dokumente enthalten keine Beispiele in der Nähe dessen, was ich tun möchte; und diese Fragen 1 , 2 Ich verstehe - aber für mich nützt es nichts - wenn ich verstehe, was dort gesagt wird.

Frage:

Ich möchte, dass @add und @remove dieselbe Variable bearbeiten (count), und @total die Gesamtzahl der Zähler zurückgibt, wobei @add und @removes berücksichtigt werden. Benutze ich module.exports falsch? oder gibt es eine gemeinsame Methode, wie Variablen gemeinsam genutzt werden, wobei eine Datei den Inhalt der module.exports ändern und die Ergebnisse in die Datei main.js zurückgeben kann?

31
thtsigma

Ihr Problem ist, dass Sie, wenn Sie var count = require('./main.js').count; ausführen, eine Kopie dieser Nummer und keine Referenz erhalten. Das Ändern von count ändert die "Quelle" nicht.

Sie sollten jedoch über die Funktion zum Export von Dateien verfügen. Das Anfordern einer Datei wird nur beim ersten Mal ausgeführt, danach wird sie jedoch zwischengespeichert und nicht erneut ausgeführt. siehe Dokumente

Vorschlag Nr. 1:

// main.js
var count = 1;
var add = require('./add.js');
count = add(count);

// add.js
module.exports = function add(count) {
    return count+10;
}

# 2:

var count = 1;
var add = function() {
    count += 10;
}
add();

# 3: Persönlich würde ich ein Zählermodul erstellen (dies ist eine einzelne Instanz, aber Sie können es leicht zu einer "Klasse" machen):

// main.js
var counter = require('./counter.js');
counter.add();
console.log(counter.count);

// counter.js
var Counter = module.exports = {
    count: 1,
    add: function() {
        Counter.count += 10;
    },
    remove: function() {
        Counter.count += 10;
    }
}
47
MiniGod

Sie sind sich nicht sicher, ob dies neu ist oder nicht, aber Sie können tatsächlich Variablen zwischen Dateien gemeinsam verwenden:

main.js

exports.main = {
    facebook: null
};

counter.js

var jamie = require('./main'); 
console.info(jamie); //{facebook: null}
jamie.main.facebook = false;
console.info(jamie); //{facebook: false}

anothercheck.js

var jamie = require('./main'); 
console.info(jamie); //{facebook: null} //values aren't updated when importing from the same file.
jamie.main.facebook = true;
console.info(jamie); //{facebook: true}

Jetzt können Sie Dateien gemeinsam nutzen.

13
Jamie Hutber

Ich habe dasselbe Problem wie Sie .. Manchmal möchte ich Variablen zwischen mehreren Dateien teilen, weil ich den modularen Stil zB liebe. Trennen von Controller, Funktion und Modellen in verschiedenen Ordnern/Dateien in meinem node.js-Skript, damit ich den Code einfach verwalten kann.

Ich weiß nicht, ob dies die beste Lösung ist, aber ich hoffe, dass es Ihren Bedürfnissen entspricht. 

models/data.js

// exports empty array
module.exports = [];

Steuerungen/somecontroller.js

var myVar = require('../models/data');
myVar.Push({name: 'Alex', age: 20});
console.log(myVar);
//  [{ name: 'Alex', age: 20 }]

Steuerungen/anotherController.js

var myVar = require('../models/data');

console.log(myVar);
// This array has value set from somecontroller.js before...
//  [{ name: 'Alex', age: 20 }]

// Put new value to array
myVar.Push({name: 'John', age: 17});
console.log(myVar);
// Value will be added to an array
//  [{ name: 'Alex', age: 20 }, { name: 'John', age: 17}]
3

Sie können keine Referenz zwischen verschiedenen Dateien freigeben. Du solltest nicht sein.

Ich habe ein main.js, das abhängig von den besagten Triggern unterschiedliche Dateien benötigt

Ich finde das nicht eine gute Idee. Alle Anweisungen, die Sie jemals benötigen, müssen oben in der Datei stehen.

Ich sehe auch, dass Sie main.js in total.js und total.js in main.js benötigen. Die Funktion require() importiert den module.exports der Datei und ordnet sie dem von Ihnen angegebenen Namespace zu. Ihr Code sollte auf diese Weise nicht in Dateien aufgeteilt werden. Sie extrahieren Code in separate Dateien nur, wenn sie selbst Module sind. Wenn Sie dies tun, importieren Sie nicht zwei Dateien voneinander.

Es ist auch gut anzumerken, dass in Javascript, wenn Sie einem Namespace etwas zuweisen, es kopiert (geklont) wird, wenn es ein Primitiv ist. Wenn es sich um ein Objekt handelt, beziehen sich beide Namespaces auf dasselbe Objekt

var num = 5; 
var prim = num;
prim++; // prim is 6, but num is still 5.

var num = {five:5};
var ob  = num;
ob.five = 6;
console.log(num.five) //also 6.
1
Ooo

Ein kleiner Hack, der funktioniert, aber nicht empfohlen wird, ist die Verwendung der Variablen process. Sie können verschiedene Eigenschaften darauf anwenden und sie im Wesentlichen wie das window-Objekt in einem browserbasierten JS verwenden. Dieser kleine Hack gibt einen Hinweis auf die Variable. Es kann geändert und bearbeitet werden, und die Änderung wird auf alle Dateien übertragen, die required sind.

Beachten Sie jedoch, dass dies nicht empfohlen wird, da das Überschreiben der Variablen process unerwartete Auswirkungen haben kann und bei einem anderen Prozess Informationen verloren gehen können.


file1.js:

const s1 = require('./file2');
process.num = 2;
console.log("file1", process.num);
s1.changeNum();
console.log("file1", process.num);

file2.js:

module.exports.changeNum = () => {
    process.num = 3;
    console.log("file2", process.num);
};

Ausgabe :

file1 2

file2 3

file1 3

0
Jacob Schneider

alternativ zu allen anderen Antworten

holt & holt

var _variableThing = 1223

module.exports = {
  get variableThing(){
    return _variableThing
  },

  set variableThing(val){
    _variableThing = val
  }
}

funktioniert jedoch nicht mit direkten Importen

0
Aditya Shankar