使用Express.js 3与数据库模块,数据库客户端应在哪里初始化?

13 浏览
0 Comments

使用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

  1. 在MVC模式应用程序中,最佳位置在哪里初始化Redis客户端?
  2. \n

  3. 如何将这个Redis客户端实例传递给多个模型,使用require(\'./models\')(db)
  4. \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现在看起来更好了吗?

0
0 Comments

使用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

这是个品味问题,我认为。我个人更喜欢执行一些显式操作来检索一个变量,而不是它只是“存在”。

0