node.js - 使用不需要导出

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

但是您可以看到 db.jscache.js 文件中的任何地方都没有 module.exports !当我用谷歌搜索它以了解它的工作原理时,这些示例总是一起讨论 module.exportsrequire

问题

  1. 有人能解释一下这样单独使用 require 是如何工作的吗?

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

最佳答案

Could someone explain what is happening with this code? In other words, how does require work when not used with export.

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

考虑以下 Foo.js 模块:

var foo = {};

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

foo.greet();

我可以在我的主文件中导入这个模块,如下所示:

require('./foo');

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

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

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

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

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

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

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

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

关于node.js - 使用不需要导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38172337/

相关文章:

javascript - 解析 JavaScript 并跟踪所有变量及其值

javascript - Azure 应用服务 - Nodejs ES 模块错误

javascript - '杂耍异步' - 为什么我的解决方案根本不返回任何内容?

javascript - 如何从一个函数中的多个模式检索和传递数据

javascript - ExpressJS 逗号分隔值

javascript - dynamodb.put().promise() 不返回放置对象

node.js - 防止错误破坏/崩溃 gulp watch

javascript - Node.js Express 应用程序无法从 dropzone.js 回调重定向

node.js - 协作中间件的首选架构是什么?

node.js - 如何在环回中验证/授权快速路由