node.js - servidor - El módulo requerido por NodeJS no está disponible en otros módulos
npm (2)
Soy un poco nuevo para NodeJS. Tal vez sea así como funciona, pero para estar seguro:
Mi ''index.js'':
var fs = require(''fs'');
// do something with fs here
var app = require(''./app.js'');
El ''app.js''
fs.readFile(''/somedir/somefile.txt'', ''utf8'', function (err,data) {
if (err) {
return console.log(err);
}
console.log(data);
});
Entonces me sale un error:
ReferenceError: fs is not defined
Como he leído, la ''solución'' a esto es ''volver a requerir'' el módulo fs en app.js. Ahora lo que sí entiendo es que el módulo fs está en caché (cualquier módulo, pero usando el ejemplo), por lo que Node seguirá siendo muy rápido. Lo que realmente no entiendo es: "Si el módulo fs se almacena en caché, así que en realidad está un poco disponible de todos modos, ¿por qué todavía tengo que" volver a requerir "el módulo?
Seré honesto; es sólo para entender por qué.
A veces podemos olvidarlo, pero es fundamental declararlo:
var fs = require(''fs'');
Cada archivo debe incluir referencias a los módulos.
index.js
var fs = require("fs"),
other = require("./otherfile");
// you can now use `fs`
otroarchivo.js
var fs = require("fs");
// you can now use `fs` here
Una de las mejores partes de esto es que no está obligado a nombrar la variable de una manera determinada en un archivo determinado. Cada archivo está bastante aislado de todos los demás archivos en su biblioteca, y eso es algo muy bueno.
También sepa que puede incluir solo partes de un módulo si lo desea
var read = require("fs").readFile;
read("myfile.txt", function(err, data) {
if (error) {
return throw error;
}
console.log(data);
};
Explicación:
Node.js no fomenta el uso de globales; y como tal, no debe intentar implementar cosas que dependan de variables globales.
Cuando vuelve a llamar al módulo fs
, en realidad no es "volver a requerirlo" sino que simplemente está declarando una variable que apunta al módulo en caché.
Ejemplo adicional:
En esta respuesta voy a detallar cómo estructurar una aplicación simple que evita el uso de globales.