使用不需要导出

我有这个代码(这工作非常好),我已经从一个在线资源借:

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. 我如何使caching/ Redis连接可用,以便它可以在我的userRoutes文件中使用类似的东西: var userRoutes = require('./routes/user')(redis);

有人可以解释这个代码发生了什么? 换句话说,如果不用于出口,需要如何工作。

我们几乎总是看到require()module.exports一起module.exports ,但是你不需要。 如果不导出任何内容,导入模块中的代码仍将运行,但不能将导入绑定到variables并与之交互。

考虑下面的Foo.js模块:

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

我可以在我的主文件中导入这个模块,就像这样:

 require('./foo'); 

如果我运行这个主文件, Foo.js模块中的代码将会运行,而来自Foo的Hello! 将被打印到控制台。

但是,我不能直接与foo对象交互。 以下代码将不起作用:

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

我可以将模块导入绑定到一个variables,但即使这不会工作:

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

为了让它起作用,我需要使用你熟悉的module.exports从我的模块中导出foo对象。

这表明你不需要从你的模块中导出任何东西,就像在你需要的时候你不需要把导入的模块绑定到一个variables一样。 不同之处在于,如果您不导出您不希望在该模块中显示的内容,则将无法与导入模块中的代码进行交互。

在你的问题的代码中,导入Redis是可行的,因为这个模块是独立的,你不需要在你的代码中进行交互。 你只需要导入代码,以便它可以运行(需要主要的Redis模块和创build客户端)

当你调用require ,模块被加载并执行。 所以你有一个连接mongoose。 其实require把你的整个模块代码注入到那里并最终运行一个函数。

否,如果你想重用模块中创build的variables,你应该导出它。 喜欢 :

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

除了要求不包含导出的模块运行副作用以外,模块还可以在全局范围中定义variables,这些variables可以在需要模块的文件中访问。 这是通过定义不带var关键字的variables来实现的。 这不是一个好习惯或惯例,但是你可能在某个地方遇到它,所以知道发生了什么是很好的。

例:

 // foo.js bar = 5; 

 // test.js require('./foo'); console.log(bar); // prints 5 

如果bar被定义为:

 var bar = 5; 

它将在模块范围内,不能在test.js访问。