Compartir y modificar una variable entre varios archivos node.js
variables module (4)
No estoy seguro de si esto es nuevo o no, pero sí puede compartir variables entre los archivos como tales:
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}
Ahora puedes compartir archivos.
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
Fondo:
Tengo una aplicación (irc bot), y quiero agregar una característica que los píos pueden hacer @add 1 o @remove 1. Tengo un main.js que luego requiere diferentes archivos dependiendo de los desencadenantes que se dicen. Así que agregar dispararía el archivo add.js, y luego requeriría (''main.js'') y agregaría 10 (10 para simplificar, realmente analizará el número y usará ese número). El problema que tengo es cuando alguien va y retira @remove. Requiere (''main.js'') y resta 10 de 1 resultando en -9. Y hacer @total generaría 1.
He realizado una búsqueda bastante buena de module.exports y no he encontrado un ejemplo como el que mencioné anteriormente. Los documentos no incluyen ejemplos cercanos a lo que quiero hacer; y estas preguntas 1 , 2 entiendo, pero no son de ninguna utilidad para mí, ya que entiendo lo que se dice allí.
Pregunta:
Me gustaría que tanto @add como @remove manipulen la misma variable (recuento), y para @total para devolver el total del recuento con los retiros @add y @ tomados en cuenta. ¿Estoy utilizando module.exports incorrectamente? ¿o hay una forma común de que las variables se compartan, con un archivo que puede modificar los contenidos de module.exports y devolver los resultados al archivo main.js?
No hay forma de que pueda compartir una referencia entre diferentes archivos. No deberías serlo
Tengo un main.js que luego requiere diferentes archivos dependiendo de los desencadenantes que se dicen
No creo que sea una buena idea. Todas las declaraciones requeridas que alguna vez necesitará deben estar en la parte superior del archivo.
También veo que estás requiriendo main.js
en total.js
y total.js
en main.js
La función require()
importa el module.exports
del archivo y lo asigna al espacio de nombre que proporcione. Su código no debe dividirse en archivos de esta manera. Extrae el código en archivos separados solo cuando son módulos por sí mismos. Y si lo hace, no estaría importando 2 archivos el uno al otro.
También es bueno tener en cuenta que en JavaScript, cuando se asigna algo a un espacio de nombres, se copia (clona) si se trata de una primitiva. Si es un objeto, ambos espacios de nombres se refieren al mismo objeto
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.
Tengo el mismo problema que tú ... A veces me gustaría compartir variables entre varios archivos porque me encanta el estilo modular, por ejemplo. separando controlador, función, modelos en diferentes carpetas / archivos en mi script node.js para que pueda administrar el código fácilmente.
No sé si esta es la mejor solución, pero espero que se ajuste a sus necesidades.
models / data.js
// exports empty array
module.exports = [];
controladores / somecontroller.js
var myVar = require(''../models/data'');
myVar.push({name: ''Alex'', age: 20});
console.log(myVar);
// [{ name: ''Alex'', age: 20 }]
controladores / 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}]
Tu problema es que cuando haces var count = require(''./main.js'').count;
, obtienes una copia de ese número, no una referencia. Cambiar count
no cambia la "fuente".
Sin embargo, debe tener las funciones de exportación de archivos. La solicitud de un archivo solo se ejecutará la primera vez, pero luego se almacena en caché y no se vuelve a ejecutar. ver documentos
Sugerencia n. ° 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: Personalmente crearía un módulo de contador (esta es una sola instancia, pero puedes convertirla fácilmente en una "clase"):
// 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;
}
}