【问题标题】:Repository Pattern for node.js using mongoose使用 mongoose 的 node.js 的存储库模式
【发布时间】:2017-01-20 14:24:10
【问题描述】:

我是 node.js 的新手,来自 .net 背景。我想使用一些我在 c#.net 中使用的设计模式。然而,由于 c# 和 JavaScript 之间面向对象的性质不同,我遇到了一些复杂情况。

特别是,我想实现存储库模式,但找不到很多使用 node.js 执行此操作的示例。 JavaScript 和猫鼬的设置方式让我有点难以理解这一点。

我参考了以下 url 以获取示例 https://github.com/iainjmitchell/mongorepositiory,我可能是错的,但我看不出此示例允许您传递回调的地方,这些回调将允许您的代码处理之后可能出现的任何错误db 调用与通常使用 mongoose 进行调用不同。

【问题讨论】:

    标签: javascript node.js mongoose repository-pattern


    【解决方案1】:

    我将解释 CRUD 操作的两个功能,即创建和读取,你会有休息的想法。 我们将有以下层:

    • 控制器
    • 服务
    • 存储库

    让我们首先使用猫鼬模式设置我们的模型。这是在 test.model.js 中。

    var mongoose = require("mongoose");
    var Schema = mongoose.Schema;
    
    var userSchema = new mongoose.Schema({
      username: String,
      password: String, //hash created from password
      created_at: { type: Date, default: Date.now }
    });
    
    module.exports = mongoose.model("User", userSchema);
    

    我不会解释控制器将如何请求服务层来发布或接收数据。它只是从服务层调用一个方法。所以在服务层内部,例如 test.service.js。我们将请求存储库层,如下所示。提供存储库和模型的路径作为文件夹结构。

    const repository = require("../../models/repository");
    var mongoose = require("mongoose");
    var User = mongoose.model("User");
    
    function createTestData(user1) {
      return new Promise(function(resolve, reject) {
        let user = new User(user1);// user1 is a object to be saved
        repository
          .create(user)
          .then(data => {
            resolve({
              data: data
            });
          })
          .catch(err => {
            reject(err);
          });
      });
    }
    
    function listTestData() {
      let params = {
        limit: 10
      };
      return new Promise(function(resolve, reject) {
        repository
          .list(User, params)
          .then(data => resolve(data))
          .catch(err => reject(err));
      });
    }
    

    现在我们将创建一个存储库,以便所有其他服务都可以调用此存储库以实现 CRUD 功能。这将有助于减少样板代码。

    function create(Model) {
      return new Promise((resolve, reject) => {
        Model.save(function(err, user) {
          if (err) {
            reject(err);
          }
          resolve(user);
        });
      });
    }
    
    function list(Model, queryParams) {
      return new Promise((resolve, reject) => {
        Model.find({})
          .limit(parseInt(queryParams.limit))
          .exec(function(err, data) {
            if (err) reject(err);
            resolve(data);
          });
      });
    }
    

    就是这样。我试图尽可能简单地解释。您可能需要配置其他设置,例如连接到数据库。但是,如果您可以完成这项工作,您可以向存储库添加其他功能。

    【讨论】:

      猜你喜欢
      • 2016-10-01
      • 2012-05-23
      • 2020-02-05
      • 2014-05-13
      • 2012-01-09
      • 2011-04-19
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      相关资源
      最近更新 更多