node.js - 将 Express.js 3 与数据库模块一起使用,在哪里初始化数据库客户端?

标签 node.js model-view-controller express redis

知道 Express.js 几乎让开发人员决定应用程序结构,并在阅读了很多关于 SO 的建议(例如参见 link1link2)并检查了 example in official repo 之后,我仍然不确定我正在做的事情是否是最好的前进方式。

假设我在我的应用程序中广泛使用 Redis,并且我有多个需要 redis 客户端运行查询的“模型”,在主 app.js 中初始化 redis 客户端会更好吗,如下所示:

var db = redis.createClient();
var models = require('./models')(db);
var routes = require('./controllers')(models);

或者在每个模型中初始化 redis,然后让每个 Controller 都需要感兴趣的模型会更好吗?

后一种方法是我正在使用的方法,它看起来不那么干。但是传递模型实例是最好的方法吗?请注意,我在这里加载了多个模型/ Controller - 我不确定如何修改我的设置以将 redis 客户端正确传递给每个模型。

//currently in models/index.js

exports.home = require('./home.js');
exports.users = require('./user.js');

TL;DR,我的问题是:

  1. 在 MVC 模式应用中最好在哪里初始化 Redis 客户端?
  2. 如何使用 require('./models')(db)
  3. 将此 redis 客户端实例传递给多个模型

更新:

我为 index.js 尝试了一种不同的方法,使用 module.exports 来返回模型/ Controller 的对象:

module.exports = function(models){

  var routes = {};

  routes.online = require('./home.js')(models);
  routes.users = require('./user.js')(models);

  return routes;

};

现在似乎是个更好的主意?

最佳答案

如果我分享一下我最近如何使用 Patio 实现一个项目,也许会有用,一个 SQL ORM。更多背景知识:我使用的 MVC 框架是 Locomotive ,但这绝对不是必需的(Locomotive 没有 ORM,它将如何处理模型和数据库留给开发人员,类似于 Express)。

Locomotive 有一个称为“初始化程序”的结构,它只是在应用程序启动期间加载的 JS 文件;他们做什么取决于开发人员。在我的项目中,一个初始化程序配置了数据库。

初始化程序建立了实际的数据库连接,还负责加载 model 目录中的所有 JS 文件。在伪代码中:

registry = require('model_registry'); // see below
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'; // used by registry, see below
  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(...);

免责声明:这对我有用,YMMV。此外,上面的代码示例没有考虑任何异步要求或错误处理,因此在我的案例中的实际实现要复杂一些。

关于node.js - 将 Express.js 3 与数据库模块一起使用,在哪里初始化数据库客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15700802/

相关文章:

node.js - Nodejs 客户端缺少属性

java - 将 Java 应用程序转换为 Applet

c# - 如何在 View 中的文本框中添加小时和分钟以过滤数据

node.js - Sails.js:如何知道请求是否包含要上传的文件?

node.js - 如何在 header 中传递参数

node.js - 为什么 “npm install” 不重写 package-lock.json?如果不存在也不生成新的?

javascript - 通过GET请求只拉取对象的某些部分

javascript - 如何禁用右键单击 IFRAME

javascript - 使用 Passed Mongodb 通过 res.render ('jadeview' 快速检索数据,在 Jade View 中邮寄 :mongodbretriveddata) in script. 标签?

javascript - 如何将 res.json 作为回调函数传递?