node.js - usar - Usando require sin exportar
node js year (3)
Tengo este código (que funciona perfectamente bien) que tomé prestado de un recurso en línea:
var express = require(''express'');
var bodyParser = require(''body-parser'');
var logger = require(''morgan'');
var app = express();
require(''./init/db'');
require(''./init/cache''); //Bring in Redis
//Define Routes
var userRoutes = require(''./routes/user'');
module.exports = app;
¿Lo que no entiendo es "requerir" cuando se usa de esta manera? Aquí está el archivo que trae:
//db.js
var mongoose = require(''mongoose'');
var dbURI = <theURI>;
mongoose.connect(dbURI);
// CONNECTION EVENTS
mongoose.connection.on(''connected'', function() {
console.log(''Mongoose connected successfully'');
});
Es lo mismo con mi conexión Redis:
//cache.js
var redis = require("redis");
var redisClient = redis.createClient(process.env.CACHE_PORT, process.env.CACHE_URL);
redisClient.auth(process.env.CACHE_PASS);
redisClient.on("ready", function () {
console.log("Cache is connected");
});
¡Pero como puede ver, no hay ningún module.exports
en ningún lugar en los archivos db.js
o cache.js
! Cuando busco en Google para entender cómo funciona, los ejemplos siempre hablan de module.exports
y require
juntos.
Preguntas
¿Alguien podría explicar cómo funciona la necesidad cuando se usa solo de esta manera?
¿Cómo puedo hacer que la conexión de caché / Redis esté disponible para que pueda usarse en mi archivo
userRoutes
usando algo como:var userRoutes = require(''./routes/user'')(redis);
¿Podría alguien explicar lo que está pasando con este código? En otras palabras, ¿cómo requiere trabajo cuando no se utiliza con la exportación?
Casi siempre vemos require()
se utiliza require()
con module.exports
, pero no tiene que hacerlo. Cuando no exporta nada, el código en el módulo importado aún se ejecutará, pero no puede vincular la importación a una variable e interactuar con ella.
Considere el siguiente módulo Foo.js
:
var foo = {};
foo.greet = function(){
console.log(''Hello from Foo!'');
}
foo.greet();
Puedo importar este módulo en mi archivo principal, así:
require(''./foo'');
Si ejecuto este archivo principal, se ejecutará el código dentro del módulo Foo.js
, y ¡Hola de Foo! Será impreso en la consola.
Sin embargo, no puedo interactuar con el objeto foo directamente. El siguiente código no funcionará:
require(''./foo'');
foo.greet(); //ReferenceError, foo is not defined
Puedo enlazar la importación del módulo a una variable, pero incluso esto no funcionará:
var foo = require(''./foo'');
foo.greet(); //TypeError, foo.greet is not a function
Para que funcione, necesito exportar el objeto foo desde mi módulo, usando el módulo de exportación con el que está familiarizado.
Esto demuestra que no necesita exportar nada de sus módulos, al igual que no necesita vincular el módulo importado a una variable cuando la necesite. La diferencia es que no podrá interactuar con el código en el módulo importado, si no exporta lo que no desea hacer visible en ese módulo.
En el código de su pregunta, la importación de Redis funciona porque ese módulo es autónomo, no necesita interactuar con él en su código. Solo necesita importar el código para que pueda ejecutarse (requiere el módulo Redis principal y cree el cliente)
Además de requerir un módulo que no incluya exportaciones para ejecutar sus efectos secundarios, también es posible que un módulo defina variables en el alcance global a las que se puede acceder en el archivo donde se requiere el módulo. Esto sucede definiendo variables sin la palabra clave var
. No es una práctica buena o común, pero puede encontrarla en algún lugar, así que es bueno saber qué está pasando.
Ejemplo:
// foo.js
bar = 5;
Y
// test.js
require(''./foo'');
console.log(bar);
// prints 5
Si la bar
fue definida como:
var bar = 5;
estaría en el alcance del módulo y no sería accesible en test.js
Cuando llames require
el módulo esté cargado y ejecutado. Así que tienes una mangosta conectada. En realidad, hace que una función que su código de módulo completo se inyecte allí y finalmente se ejecute.
No, si desea reutilizar las variables creadas en módulos, debe exportar eso. Me gusta :
//cache.js
var redis = require("redis");
var redisClient = redis.createClient(process.env.CACHE_PORT, process.env.CACHE_URL);
redisClient.auth(process.env.CACHE_PASS);
redisClient.on("ready", function () {
console.log("Cache is connected");
});
module.exports = redisClient;