使用require而不导出

时间:2016-07-03 17:07:35

标签: node.js express

我有这个代码(效果非常好),我从在线资源中借用了这些代码:

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

但正如您所看到module.exportsdb.js个文件中的任何位置都没有cache.js!当我谷歌这一点来了解它是如何工作的时候,这些例子总是一起讨论module.exportsrequire

问题

  1. 当有人这样使用时,有人可以解释一下需要如何工作吗?

  2. 如何使缓存/ Redis连接可用,以便可以使用以下内容在userRoutes文件中使用它:var userRoutes = require('./routes/user')(redis);

3 个答案:

答案 0 :(得分:40)

  

有人可以解释这段代码发生了什么吗?换句话说,当不与导出一起使用时,如何工作。

我们几乎总是看到require()module.exports一起使用,但您不必这样做。如果您没有导出任何内容,导入模块中的代码仍会运行,但您无法将导入绑定到变量并与之交互。

考虑以下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

我可以将模块导入绑定到变量,但即使这样也行不通:

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

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

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

在您问题的代码中,导入Redis是有效的,因为该模块是自包含的,您不需要在代码中与其进行交互。您只需要导入代码以便它可以运行(需要主Redis模块并创建客户端)

答案 1 :(得分:6)

除了要求一个不包含导出的模块来运行它的副作用外,模块还可以在全局范围内定义变量,这些变量可以在需要模块的文件中访问。这通过定义没有// foo.js bar = 5; 关键字的变量来实现。这不是一个好的或常见的做法,但你可能会在某个地方遇到它,所以知道发生了什么事情很好。

示例:

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

console.log(bar);
// prints 5

bar

如果var bar = 5; 被定义为:

test.js

它将在模块范围内,无法在CREATE TABLE Person( ID uniqueidentifier not null, Name varchar(100), DateOfBirth datetime) CREATE TABLE Sport ( ID uniqueidentifier not null, Description varchar(50)) -- e.g. Football; Tennis; Badminton etc CREATE TABLE PersonPlaysSport ( PersonID uniqueidentifier FOREIGN KEY REFERENCES Person(ID), SportID uniqueidentifier FOREIGN KEY REFERENCE Sport (ID), primary key (PersonID, SportID) 中访问。

答案 2 :(得分:3)

当您致电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;