我使用单独的路由器文件作为主应用和auth app的模块。我无法获得将变量(db client)传递到路由器的最佳方法。我不想硬编码或传递它:
module.exports = function(app, db) {
也许这是使用单例寄存器或使用全局db变量的最佳方法?
您对设计模式的体验是什么?哪种方式最好,为什么?
答案 0 :(得分:108)
我发现使用依赖注入来传递信息是最好的风格。它确实看起来像你有:
// 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
和app
参数注入它并仅测试database
代码本身。Routes
,即应用程序入口点)。这为您提供了一个查看系统中所有内容如何组合的地方。我见过的对此更好的解释之一是an interview with Mark Seeman,优秀着作 .NET中的依赖注入的作者。它同样适用于JavaScript,尤其适用于Node.js:server.js
通常用作经典服务定位器,而不仅仅是模块系统。
答案 1 :(得分:2)
我建议你创建一个包含db实例的设置文件,以及你需要全局使用的其他东西,比如'singleton'。
例如,我在我的redis数据库客户端上有settings.js:
var redis = require('redis');
exports.redis = redis.createClient(6379, '127.0.0.1');
在其他多个模块中,我包括它:
var settings = require('./settings');
setting.redis.<...>
很多时候包括它我总是有一个数据库连接实例。
答案 2 :(得分:1)
如果您使用依赖注入框架
,您可以自己保存所有连接模块的样板代码This answer列出了其中一些。我还构建了一个simpler DI framework here。
编辑:以下是该页面更改时的答案副本
require
是 在Node.js中管理依赖关系的方式,当然它是直观有效的,但它也有其局限性。
我的建议是看看今天可用于Node.js的一些依赖注入容器,以了解它们的优缺点。其中一些是:
仅举几例。
现在真正的问题是,与简单的require
相比,使用Node.js DI容器可以实现什么?
<强>优点:强>
<强>缺点:强>
require
绝对感觉你偏离了Node的思维方式。答案 3 :(得分:0)
它已完全过时,但您可以使用global
在脚本中:
global.foo = new Foo();
在另一个脚本中:
foo.bar();
您还可以使用已存在的常量:
Object.foo = new Foo();
在这里:
Object.foo.bar();