使用不需要导出
我有这个代码(这工作非常好),我已经从一个在线资源借:
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.js
或cache.js
文件的任何地方都没有module.exports
! 当我谷歌了解它是如何工作的例子总是谈论module.exports
并require
在一起。
问题
-
有人可以解释如何使用自己的需求时,像这样?
-
我如何使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
访问。