2016-07-03 27 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不可访问。