2016-07-03 15 views
13

mam ten kod (który doskonale działa dobrze), który mam pożyczone z zasobów internetowych:Korzystanie wymagać bez eksportu

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; 

Bit Nie rozumiem to „wymaga” użyte w ten sposób ? Oto plik przynosi w:

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

mongoose.connect(dbURI); 

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

Tak samo jest z moim związku 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"); 
}); 

ale jak widać nie ma nigdzie w module.exportsdb.js lub cache.js plików! Kiedy google to zrozumieć, jak to działa, przykłady zawsze mówią o module.exports i require razem.

Pytania

  1. Może ktoś wyjaśnić, jak wymagają prace kiedy stosuje się w monoterapii jak to?

  2. Jak mogę udostępnić cache/połączenie Redis tak, że może on być stosowany w moim userRoutes pliku za coś takiego: var userRoutes = require('./routes/user')(redis);

+0

Możesz zdecydowanie eksportować połączenie mangusty do wykorzystania w innych modułach jako odniesienie do DB. Po prostu Google to (np. Eksport połączenia mangusta), a znajdziesz wiele przykładów. –

+0

Mój kod działa poprawnie i mogę wysłać zapytanie do bazy danych z pliku tras, ale nie rozumiem, w jaki sposób! – tommyd456

+0

Doskonałe pytanie! Dziękuję za pytanie. Pomogło mi to zrozumieć wiele rzeczy i wykonać moją pracę! – kirtan403

Odpowiedz

24

Może ktoś wyjaśnić, co się dzieje z tym kodem? Innymi słowy, w jaki sposób działają, gdy nie są używane z eksportem.

Prawie zawsze zobaczyć require() używany z module.exports, ale nie muszą. Jeśli nie wyeksportujesz niczego, kod w importowanym module nadal będzie działał, ale nie możesz powiązać importu z zmienną i wchodzić z nią w interakcję.

Rozważmy następujący Foo.js moduł:

var foo = {}; 

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

foo.greet(); 

mogę zaimportować ten moduł w moim głównym pliku, tak jak poniżej:

require('./foo'); 

Jeśli uruchomić ten plik główny, kod wewnątrz modułu Foo.js będzie działać, i Witaj z Foo! zostanie wydrukowany na konsoli.

Jednak nie mogę bezpośrednio interakcji z obiektem foo. Poniższy kod nie zadziała:

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

mogę związać importu modułu do zmiennej, ale nawet to nie będzie działać:

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

Aby zmusić go do pracy, muszę wyeksportować foo obiekt z mojego modułu, korzystający z module.exports, który znasz.

Pokazuje to, że nie trzeba eksportować niczego z modułów, tak jak nie trzeba wiązać importowanego modułu ze zmienną, gdy jest to wymagane.Różnica polega na tym, że nie będziesz w stanie wchodzić w interakcje z kodem w importowanym module, jeśli nie wyeksportujesz tego, co nie chcesz uwidocznić w tym module.

W kodzie w twoim pytaniu, importowanie Redisa działa, ponieważ ten moduł jest samowystarczalny, nie musisz wchodzić z nim w interakcję. Wystarczy zaimportować kod, aby mógł działać (wymagany jest główny moduł Redis i utworzyć klienta).

+0

Dzięki, to jest naprawdę pomocne. Odnośnie części Redis, muszę udostępnić 'redisClient' w moim pliku' userRoutes'. Czy jest to prosty przypadek dodania 'module.exports = redisClient' na dole pliku' cache.js'? – tommyd456

+0

Tak, jeśli wyeksportujesz 'redisClient' i powiążesz' require' ze zmienną, będziesz mógł uzyskać do niej dostęp za pośrednictwem tej zmiennej – Drown

+0

To jest świetna odpowiedź! Szukałem czegoś takiego od dnia po tym, jak moje 2 aplikacje pracowały z jednego pliku. Świetna sprawa! I wspaniałe pytanie też! – kirtan403

2

Po wywołaniu require moduł jest ładowany i wykonywany. Więc masz połączoną mangustę. Właściwie to require tworzy funkcję, w którą wstawiony jest cały twój kod modułu i ostatecznie uruchomiony.

Nie, jeśli chcesz ponownie użyć zmiennych utworzonych w modułach, wyeksportuj je. Jak:

//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

Dzięki, właśnie dodałem komentarz do drugiej odpowiedzi, która jest taka sama jak ta. Pozdrawiam mimo wszystko. – tommyd456

0

Poza wymagające moduł, który nie obejmuje eksport, aby go uruchomić nie skutkach ubocznych jest to również możliwe, że moduł do definiowania zmiennych w zasięgu globalnym, które mogą być dostępne w pliku, w którym wymagany jest moduł. Dzieje się to poprzez zdefiniowanie zmiennych bez słowa kluczowego var. To nie jest dobra ani powszechna praktyka, ale możesz ją gdzieś spotkać, więc dobrze jest wiedzieć, co się dzieje.

przykład:

// foo.js 
bar = 5; 

I

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

console.log(bar); 
// prints 5 

Jeśli bar zdefiniowano jako:

var bar = 5; 

byłoby w zakresie modułu i nie są dostępne w test.js.