2016-07-03 29 views
13

我有這樣的代碼(這工作得很好),我已經從一個在線資源借來的:以這種方式使用時使用要求不出口

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; 

我不明白該位是「需要」 ?這裏是它帶來的文件:

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

mongoose.connect(dbURI); 

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

這是我的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"); 
}); 

但你可以看到有在db.jscache.js文件中沒有任何地方module.exports!當我谷歌瞭解它是如何工作的例子總是談論module.exportsrequire在一起。

問題

  1. 有人能解釋如何像這樣對自己使用時需要的作品?

  2. 我怎樣才能使高速緩存/ Redis的可用連接,以便它可以在我的userRoutes文件中使用像使用:var userRoutes = require('./routes/user')(redis);

+0

您可以絕對導出貓鼬連接,以便在其他模塊中用作對數據庫的引用。只是谷歌它(例如:出口貓鼬連接),你會發現很多的例子。 –

+0

我的代碼工作正常,我可以從我的路由文件查詢數據庫,但我不明白! – tommyd456

+0

優秀的問題!謝謝你的慰問。它幫助我瞭解了很多事情並完成了我的工作! – kirtan403

回答

24

有人能解釋一下什麼是與此代碼發生?換句話說,如果不用於導出,需要如何工作。

我們幾乎總能看到require()正在與module.exports使用,但你不必。如果不導出任何內容,導入模塊中的代碼仍將運行,但不能將導入綁定到變量並與其交互。

考慮以下Foo.js模塊:

var foo = {}; 

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

foo.greet(); 

我可以在我的主文件導入這個模塊,像這樣:

require('./foo'); 

如果我運行這個主文件,該Foo.js模塊裏面的代碼將運行,並且你好來自Foo!將被打印到控制檯。

但是,我不能直接與foo對象交互。下面的代碼將無法正常工作:

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

我可以在模塊導入綁定到一個變量,但即使這樣也不能正常工作:

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

爲了得到它的工作,我需要導出FOO對象來自我的模塊,使用您熟悉的module.exports

這表明,您不需要從模塊中導出任何內容,就像您在需要時不需要將導入的模塊綁定到變量一樣。不同之處在於,如果您不導出不想在該模塊中顯示的內容,則將無法與導入模塊中的代碼進行交互。

在你的問題的代碼中,導入Redis的工作原理是因爲該模塊是獨立的,你不需要在你的代碼中與它交互。您只需要導入代碼以便它可以運行(需要主要的Redis模塊並創建客戶端)

+0

謝謝,這真的很有幫助。關於Redis部分,我需要在我的'userRoutes'文件中提供'redisClient'。是否在'cache.js'文件的底部添加'module.exports = redisClient'是一種簡單的情況? – tommyd456

+0

是的,如果您導出'redisClient'並將'require'綁定到變量,那麼您將可以通過該變量訪問它 – Drown

+0

這是一個很好的答案!從一天後,我從一個文件中獲得我的2個應用程序後,我正在尋找這樣的事情。好東西!還有精湛的問題! – kirtan403

2

當您調用require時,模塊將被加載並執行。所以你有一個連接貓鼬。實際上require可以讓你的整個模塊代碼注入並最終運行。

不,如果你想重用模塊中創建的變量,你應該導出它。像:

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

謝謝,我剛剛添加了與此相同的其他答案的評論。無論如何,歡呼聲。 – tommyd456

0

除了需要一個模塊,不包括出口到運行它的副作用,它也可以爲一個模塊來定義它可以在需要的模塊文件中訪問全球範圍內的變量。這是通過定義不帶關鍵字var的變量來實現的。這不是一個好習慣或常見的做法,但是你可能會在某個地方遇到它,所以很高興知道發生了什麼。

實施例:

// foo.js 
bar = 5; 

而且

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

console.log(bar); 
// prints 5 

如果bar被定義爲:

var bar = 5; 

這將是在模塊範圍和test.js不可訪問。