小编典典

将公共变量传递到Node.js中单独的模块中的最佳方法是什么?

node.js

我使用单独的路由器文件作为主应用程序和身份验证应用程序的模块。我无法获得将变量(数据库客户端)传递到路由器的最佳方法。我不想对其进行硬编码或将其传递给:

module.exports = function(app, db) {

也许是使用单例寄存器或使用全局db变量的最佳方法?

您对设计模式有什么经验?哪种方法最好,为什么?


阅读 220

收藏
2020-07-07

共1个答案

小编典典

我发现使用依赖注入来传递东西是最好的样式。确实看起来像您拥有的东西:

// App.js
module.exports = function App() {
};

// Database.js
module.exports = function Database(configuration) {
};

// Routes.js
module.exports = function Routes(app, database) {
};

// server.js: composition root
var App = require("./App");
var Database = require("./Database");
var Routes = require("./Routes");
var dbConfig = require("./dbconfig.json");

var app = new App();
var database = new Database(dbConfig);
var routes = new Routes(app, database);

// Use routes.

这有很多好处:

  • 它将迫使您将系统分为具有明确依赖关系的组件,而不是将依赖关系隐藏在文件调用它们require("databaseSingleton")或更糟的位置的中间global.database
  • 它使单元测试很简单:如果我想测试Routes孤立地看,我可以用假注入它appdatabasePARAMS和测试只有Routes代码本身。
  • 它将所有对象图布线都放在一个位置,即合成根(在本例中为server.js应用程序入口点)。这使您可以查看一个地方,以查看系统中的所有组件如何组合在一起。

我所见到的对此更好的解释之一是对 .NET 优秀著作 Dependency Injection的 作者Mark
Seeman的采访
。它同样适用于JavaScript,尤其是Node.js:通常用作经典服务定位器,而不仅仅是模块系统。 __require

2020-07-07