2016-07-03 8 views
13

olmadan gerektirir ?Ben bir online kaynak ödünç ettik (gayet iyi çalışır) bu kodu var ihracat

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

mongoose.connect(dbURI); 

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

Benim Redis bağlantısı ile aynıdır:

//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"); 
}); 

ama db.js veya cache.js dosyalarındaki hiçbir module.exports yer var mı? Gördüğünüz gibi burada onun getirdiği dosyasıdır! Nasıl çalıştığını anlamak için bunu google'a gönderdiğimde örnekler her zaman module.exports ve require hakkında konuşur.

Sorular

  1. birisi böyle kendi başına kullanıldığında iüi nasıl açıklayabilir misiniz?

  2. neye benim userRoutes dosya kullanılarak bir şey kullanılabilir böylece önbellek/Redis bağlantısı kullanılabilir hale nasıl: var userRoutes = require('./routes/user')(redis);

+0

DB'ye başvuru olarak diğer modüllerde kullanmak için mongoose bağlantısını kesinlikle verebilirsiniz. Sadece Google (örneğin: ihracat mongoose bağlantısı) ve bol miktarda örnek bulacaksınız. –

+0

Kodum iyi çalışıyor ve veritabanımı rotalarımdan sorgulayabilirim ama nasıl olduğunu anlamıyorum! – tommyd456

+0

Mükemmel soru! Sorduğun için teşekkürler. Bir çok şeyi anlamama yardımcı oldu ve işimi bitirdim! – kirtan403

cevap

24

birisi bu kodla neler olduğunu açıklayabilir misiniz? Başka bir deyişle, ihracat ile kullanılmadığında nasıl çalışır. Biz hemen hemen her zaman require() bkz

module.exports ile kullanılıyor, ancak gerekmez. Hiçbir şey vermediğinizde, içe aktarılan modüldeki kod hala çalışır, ancak içe aktarmayı bir değişkene bağlayamaz ve etkileşime giremezsiniz. Öyle gibi benim ana dosyasında bu modül alabilirsiniz

var foo = {}; 

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

foo.greet(); 

:

aşağıdaki Foo.js modülü düşünün

require('./foo'); 

bu ana dosyası, Foo.js modül içerisindeki kod çalıştırırsanız Çalışacak ve Foo'dan Merhaba! konsola yazdırılacak. Ancak, doğrudan foo nesnesiyle etkileşimde bulunamıyorum.

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

Ben bir değişkene modül ithalat bağlayabilir, ancak bu bile işe yaramaz: Aşağıdaki kod çalışmaz

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

işe almak için, ben foo dışa gerek Benim modülümden, alışık olduğunuz module.exports kullanarak nesne.

Bu, modüllere ihtiyaç duyduğunuzda, içe aktarılan modülü bir değişkene bağlamanız gerekmediği gibi, herhangi bir şeyi dışa aktarmanıza gerek olmadığını gösterir.Aradaki fark, bu modülde görünmesini istemediğiniz şeyi dışa aktarmazsanız, içe aktarılan modüldeki kodla etkileşime giremeyeceğinizdir.

Sorunuzdaki kodda, Redis'i içe aktarma, bu modül kendi kendine yeten olduğu için çalışır, kodunuzda onunla etkileşime girmenize gerek yoktur. Sadece kodu çalıştırabilmeniz için (ana Redis modülünü gerektirir ve istemciyi yaratır)

+0

Teşekkürler, bu gerçekten yararlı. Redis bölümü ile ilgili olarak, "userRoutes" dosyasımda "redisClient" ini kullanmam gerekiyor. 'Cache.js' dosyasının en altında 'module.exports = redisClient' ifadesini eklemek basit bir durum mu? – tommyd456

+0

Evet, "redisClient" öğesini dışa aktarırsanız ve 'require' öğesini bir değişkene bağlarsanız o zaman bu değişkene – Drown

+0

aracılığıyla erişebilirsiniz. Bu harika bir yanıt! 2 uygulamamı tek bir dosyadan çalıştırdıktan bir gün sonra böyle bir şey arıyordum. Harika şeyler! Ve süper soru da! – kirtan403

2

require'u çağırdığınızda modül yüklenir ve çalıştırılır. Yani bağlı bir firavun var. Aslında require, tüm modül kodunuzun buraya enjekte edildiği ve sonunda çalıştığı bir işlev yapar.

Modüllerde oluşturulan değişkenleri yeniden kullanmak isterseniz, bunu dışa aktarmalısınız. Gibi: Bir modül modül gereklidir dosyasında erişilebilir küresel kapsamda değişkenleri tanımlamak için

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

Teşekkürler, diğer cevap için bir yorum ekledim, bununla aynı. Yine de şerefe. – tommyd456

0

ihracat çalıştırmak içermeyen bir modül gerektiren yanında bulunuyor yan etkiler de mümkündür. Bu var anahtar sözcüğü olmadan değişkenleri tanımlayarak olur. İyi ya da ortak bir uygulama değil, ama bununla bir yerde karşılaşabilirsin, bu yüzden neler olduğunu bilmek güzel.

Örnek:

// foo.js 
bar = 5; 

Ve

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

console.log(bar); 
// prints 5 

bar olarak tanımlandı ise:

var bar = 5; 

o modül kapsamında olması ve test.js erişilebilir olmaz.

İlgili konular