如何在节点应用程序的所有模块中提供变量和依赖项?

时间:2015-11-30 06:08:15

标签: javascript node.js modular-design

我最近构建了一个节点应用程序,并决定将其模块化。

我需要所有依赖项,声明在程序运行时由其他模块操作的数组,并在app.js文件中执行该应用程序(该文件中的其他内容已经不多了) )。这意味着所有模块化文件函数都应该在scope-chain下进行,并且可以访问app.js中所需的包和变量,对吗?

但是,app.js中定义和要求的包方法和变量会将错误抛出为未定义。这意味着我创建的模块化文件无法访问app.js文件中所需的变量和包。

该程序在一个大型应用程序文件中正常工作。如果我将app.js中的所有依赖项和变量声明为全局变量,则代码可以正常工作。如果我需要每个文件中的包,代码将会起作用。

......所有这些解决方案都破坏了模块化代码模式的目的......

您是否可以指导我在节点应用程序的所有模块中提供包和变量的一些资源,而不会混淆全局范围?

谢谢!

2 个答案:

答案 0 :(得分:0)

不,这不正确。

默认情况下封装模块,导出名为.. module.export的对象。模块无权访问父模块的上下文(或变量)。

与PHP这样的语言不同,require() 就像连接文件一样。

如果需要传递数据,例如config,db或其他模块,则需要将其传递给模块。一个简单的例子就是:

// app.js
var config = require('./config');
var db = require('./db').connect(config.DB_CONFIG);

var UsersModel = require('./usersModel')(db);

var someLogger = require('some-logger');
var logger = someLogger.init(config.SOME_OPTION);

当然,有许多不同的风格和模式。

答案 1 :(得分:0)

您可以使用相当多的技巧,this article涵盖了大部分技术。

我经常将 singleton 模式的变体用于应用程序全局上下文,例如数据库实例或记录器,然后只使用require('./provider')到每个相关文件中。您需要模块的所有文件都将获得该模块的相同实例。

依赖注入是我在其余时间使用的模式。