使用Express.js 3与数据库模块,数据库客户端应在哪里初始化?
使用Express.js 3与数据库模块,数据库客户端应在哪里初始化?
知道Express.js基本上让开发者决定应用程序的结构后,我在Stack Overflow上阅读了很多建议(参见链接1和链接2),并且检查了官方存储库中的示例,但我仍然不确定我所做的是否是最佳方式。\n假设我在我的应用程序中广泛使用Redis,并且我有多个需要Redis客户端运行查询的“模型”,是在主要的app.js文件中初始化Redis客户端更好,像这样:\n
var db = redis.createClient(); var models = require('./models')(db); var routes = require('./controllers')(models);
\n还是在每个模型中初始化Redis,然后让每个控制器需要感兴趣的模型?\n我正在使用后一种方法,看起来不太DRY(不重复)。但是传递模型实例是最好的方式吗?请注意,我在这里加载多个模型/控制器 - 我不确定如何修改我的设置以正确地将Redis客户端传递给每个模型。\n
//当前在models/index.js中 exports.home = require('./home.js'); exports.users = require('./user.js');
\nTL;DR,我的问题是:\n
- \n
- 在MVC模式应用程序中,最佳位置在哪里初始化Redis客户端?
- 如何将这个Redis客户端实例传递给多个模型,使用
require(\'./models\')(db)
?
\n
\n
\n更新:\n我尝试了一种不同的方法来编写index.js
,使用module.exports
返回一个包含模型/控制器对象的对象:\n
module.exports = function(models){ var routes = {}; routes.online = require('./home.js')(models); routes.users = require('./user.js')(models); return routes; };
\n现在看起来更好了吗?
使用Express.js 3与数据库模块,初始化数据库客户端在哪里?
最近我使用了Patio,一个SQL ORM,来实现一个项目。背景信息:我使用的MVC框架是Locomotive,但这绝对不是一个要求(Locomotive没有ORM,它将如何处理模型和数据库的实现留给开发者,类似于Express)。
Locomotive有一个叫做"initializers"的构造,它们只是在应用程序启动时加载的JS文件;它们的功能由开发者决定。在我的项目中,一个初始化器配置了数据库。
初始化器建立了实际的数据库连接,并负责加载model
目录中的所有JS文件。伪代码如下:
registry = require('model_registry'); // 详见下文 db = createDatabaseConnection(); files = fs.readDirSync(MODEL_DIRECTORY); for each file in files: if filename doesn't end with '.js': continue mod = require(path.join(MODEL_DIRECTORY, filename)); var model = mod(db); registry.registerModel(model);
模型看起来像这样:
// models/mymodel.js module.exports = function(db ) { var model = function(...) { /* model class */ }; model.modelName = 'MyModel'; // 由注册表使用,详见下文 return model; };
模型注册表是一个非常简单的模块,用于保存所有模型:
module.exports = { registerModel : function(model) { if (! model.hasOwnProperty('modelName')) throw Error('[model registry] models require a modelName property'); this[model.modelName] = model; } };
因为模型注册表将模型类存储在this
中(即module.exports
),所以它们可以从其他需要访问模型的文件中导入:
// mycontroller.js var MyModel = require('model_registry').MyModel; var instance = new MyModel(...);
免责声明:这对我有用,但因人而异。此外,上述代码示例没有考虑任何异步要求或错误处理,所以我实际情况下的实现要更加复杂。
有趣的是,你基本上将模型的集合保存在module.exports
中,我想知道它与将模块保存在GLOBAL中相比如何:stackoverflow.com/questions/5447771
这是个品味问题,我认为。我个人更喜欢执行一些显式操作来检索一个变量,而不是它只是“存在”。