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

How do you make variables and dependencies available in all modules of a node app?

本文关键字:变量 依赖 模块 节点 应用程序      更新时间:2023-09-26

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

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

然而,在app.js中定义和需要的包方法和变量会以未定义的形式抛出错误。这意味着我正在创建的模块化文件无法访问我的app.js文件中所需的变量和包。

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

所有这些解决方案都违背了模块化代码模式的目的。。。

你能告诉我一些关于在不扰乱全局范围的情况下使包和变量在节点应用程序的所有模块中可用的资源吗?

谢谢!

不,这是不对的。

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

与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);

当然,有许多不同的风格和图案。

有很多技术可以使用,本文涵盖了其中的大部分。

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

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