Partage et modification d'une variable entre plusieurs nœuds de fichiers.js

Principal.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);

Ajouter.js

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

Supprimer.js

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

Console.log

 1
 11
 -9

Contexte:

J'ai une application (bot irc), et je veux ajouter une fonctionnalité que peeps peut faire @add 1 ou @remove 1. J'ai un principal.js qui nécessite alors différents fichiers en fonction des déclencheurs qui sont dits. Donc, ajouter déclencherait l'ajout.fichier js, et cela nécessiterait alors ('main.js') et ajouter 10 (10 pour la simplification, il va réellement analyser le nombre et utiliser ce nombre) à elle. Le problème que j'ai est quand quelqu'un va et fait @ remove . Il nécessite ('main.js') et soustrait 10 de 1 résultant en -9. Et faire @total produirait 1.

J'ai fait une assez bonne recherche de module.exportations et je n'ai pas rencontré un exemple comme celui que j'ai énuméré ci-dessus. Les docs n'incluent aucun exemple proche de ce que je veux faire; et ces questions 1, 2 je comprends--mais ne sont pas d'aucun utilité pour moi -- si je comprends bien ce qui est dit là-bas.

Question:

J'aimerais que @add et @remove manipulent la même variable( count), et que @total renvoie le total de count avec les @add et @removes pris en compte. Suis-je en utilisant le module.exports incorrectement; ou Existe-t-il une manière courante de partager les variables, avec un fichier capable de modifier le contenu du module.exportations et retour des résultats à la principale.fichier js?

26
demandé sur Community 2013-06-15 08:14:35

4 réponses

Votre problème est que lorsque vous faites var count = require('./main.js').count;, vous obtenez une copie de ce numéro, Pas une référence. Changer count ne change pas la "source".

Cependant, vous devriez avoir les fonctions d'exportation de fichiers. Exiger un fichier ne l'exécutera que la première fois, mais après cela, il est mis en cache et ne se réexécute pas. voir docs

Suggestion # 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: personnellement, je créerais un module de compteur (c'est une seule instance, mais vous pouvez facilement en faire un "classe"):

// 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;
    }
}
38
répondu MiniGod 2015-08-31 17:35:10

Je ne sais pas si ce nouveau ou non mais vous pouvez en effet partager des variables entre les fichiers en tant que tels:

Principal.js

exports.main = {
    facebook: null
};

Le Compteur.js

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

Une autre vérification.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}

Maintenant, vous pouvez partager entre les fichiers.

12
répondu Jamie Hutber 2018-07-16 10:13:47

J'ai le même problème que vous,.. Parfois, je voudrais partager des variables entre plusieurs fichiers parce que j'aime le style modulaire, par exemple. contrôleur de séparation, fonction, modèles dans différents dossiers / fichiers sur mon nœud.script js afin que je puisse facilement gérer le code.

Je ne sais pas si c'est la meilleure solution mais j'espère qu'elle répondra à vos besoins.

Modèles/données.js

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

Contrôleurs/somecontroller.js

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

Contrôleurs / 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
répondu Yudhi Armyndharis 2016-06-09 16:58:07

Il n'y a aucun moyen de partager une référence entre différents fichiers. Vous ne devriez pas l'être.

, j'ai une première.js qui nécessite alors différents fichiers en fonction des déclencheurs qui sont dits

Je ne pense pas que ce soit une bonne idée. Toutes les instructions require dont vous aurez besoin doivent être en haut du fichier.

, je vois aussi que Vous êtes exigeant main.js dans total.js et total.js dans main.js. La fonction require() importe le module.exports du fichier et l'affecte à l'espace de noms que vous fournir. Votre code ne doit pas être divisé en fichiers de cette façon. Vous extrayez du code dans des fichiers séparés uniquement lorsqu'ils sont des modules seuls. Et si vous le faites, vous n'importeriez pas 2 fichiers les uns sur les autres.

Il est également bon de noter qu'en javascript, lorsque vous affectez quelque chose à un espace de noms, il est copié (cloné) s'il s'agit d'une primitive. Si c'est un objet, les deux espaces de noms font alors référence au même objet

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
répondu Ooo 2013-06-15 06:06:38