2016-07-03 23 views
13

ho questo codice (che funziona perfettamente), che ho preso in prestito da una risorsa in linea:Utilizzando richiedere senza esportazione

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; 

Il bit che non capisco è "richiedono" quando viene utilizzato in questo modo ? Ecco il file che porta in:

//db.js 
var mongoose = require('mongoose'); 
var dbURI = <theURI>; 

mongoose.connect(dbURI); 

// CONNECTION EVENTS 
mongoose.connection.on('connected', function() { 
    console.log('Mongoose connected successfully'); 
}); 

E 'lo stesso con la mia connessione 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"); 
}); 

ma come potete vedere non v'è alcuna module.exports ovunque nei file db.js o cache.js! Quando google questo per capire come funziona, gli esempi parlano sempre di module.exports e di require insieme.

Domande

  1. Qualcuno potrebbe spiegare come funziona richiede se usato da solo in questo modo?

  2. Come posso fare il collegamento cache/Redis disponibili in modo che possa essere utilizzato nel mio userRoutes file usando qualcosa come: var userRoutes = require('./routes/user')(redis);

+0

È possibile esportare la connessione della mangusta in modo che possa essere utilizzata in altri moduli come riferimento per DB. Basta Google (ad esempio: esportazione di connessione mangusta) e troverai un sacco di esempi. –

+0

Il mio codice funziona correttamente e posso interrogare il database dal mio file di rotte ma non capisco come! – tommyd456

+0

Ottima domanda! Grazie per avermelo chiesto. Mi ha aiutato a capire molte cose e a fare il mio lavoro! – kirtan403

risposta

24

qualcuno potrebbe spiegare cosa sta succedendo con questo codice? In altre parole, come richiede lavoro se non utilizzato con l'esportazione.

Abbiamo quasi sempre vediamo require() essere utilizzato con module.exports, ma non si deve. Quando non si esporta nulla, il codice nel modulo importato verrà comunque eseguito, ma non è possibile associare l'importazione a una variabile e interagire con essa.

consideri il Foo.js modulo seguente:

var foo = {}; 

foo.greet = function(){ 
    console.log('Hello from Foo!'); 
} 

foo.greet(); 

posso importare questo modulo nel mio file principale, in questo modo:

require('./foo'); 

Se corro questo file principale, il codice all'interno del modulo Foo.js correrà, e Ciao da Foo! verrà stampato sulla console.

Tuttavia, non posso interagire direttamente con l'oggetto foo. Il seguente codice non funziona:

require('./foo'); 
foo.greet(); //ReferenceError, foo is not defined 

posso legare l'importazione del modulo a una variabile, ma anche questo non funziona:

var foo = require('./foo'); 
foo.greet(); //TypeError, foo.greet is not a function 

Per farlo funzionare, ho bisogno di esportare il foo oggetto dal mio modulo, usando lo module.exports con cui si ha familiarità.

Ciò dimostra che non è necessario esportare nulla dai moduli, proprio come non è necessario associare il modulo importato a una variabile quando lo si richiede.La differenza è che non sarai in grado di interagire con il codice nel modulo importato, se non esporti ciò che non vuoi rendere visibile in quel modulo.

Nel codice della domanda, l'importazione di Redis funziona perché il modulo è autonomo, non è necessario interagire con esso nel codice. È necessario solo importare il codice in modo che possa essere eseguito (richiedere il modulo Redis principale e creare il client)

+0

Grazie, questo è davvero utile. Per quanto riguarda la parte di Redis, ho bisogno di rendere disponibile 'redisClient' nel mio file' userRoutes'. È un semplice caso di aggiungere 'module.exports = redisClient' nella parte inferiore del file' cache.js'? – tommyd456

+0

Sì, se si esporta 'redisClient' e si associa' require' a una variabile, sarà possibile accedervi tramite tale variabile – Drown

+0

Questa è una grande risposta! Stavo cercando qualcosa del genere da un giorno dopo che le mie 2 app funzionavano da un singolo file. Grandi cose! E anche un'ottima domanda! – kirtan403

2

Quando si chiama require, il modulo viene caricato ed eseguito. Quindi hai una mangusta connessa. In realtà, require esegue una funzione che l'intero codice del modulo viene iniettato lì e infine eseguito.

No, se si desidera riutilizzare le variabili create nei moduli, è necessario esportarle. Come:

//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; 
+0

Grazie, ho appena aggiunto un commento per l'altra risposta che è la stessa di questo. Saluti comunque. – tommyd456

0

Oltre a richiedere un modulo che non includono le esportazioni di eseguire i suoi effetti collaterali è anche possibile per un modulo di definire le variabili nella portata globale che si può accedere nel file in cui è richiesto il modulo. Ciò avviene definendo le variabili senza la parola chiave var. Non è una pratica buona o comune, ma potresti incontrarla da qualche parte quindi è bello sapere cosa sta succedendo.

Esempio:

// foo.js 
bar = 5; 

E

// test.js 
require('./foo'); 

console.log(bar); 
// prints 5 

Se bar è stata definita come:

var bar = 5; 

sarebbe nell'ambito modulo e non essere accessibile in test.js.

Problemi correlati