使用猫鼬的node.js的存储库模式

use*_*300 5 javascript repository-pattern mongoose node.js

我是Node.js的新手,来自.net背景。我想使用与c#.net一起使用的一些设计模式。但是由于c#和JavaScript在面向对象性质上的差异,我遇到了一些麻烦。

特别是,我想实现存储库模式,但无法找到很多使用node进行操作的示例。JavaScript和猫鼬的设置方式使我很难确定这一点。

我被引用到以下URL作为示例https://github.com/iainjmitchell/mongorepositiory,我可能是错的,但是我看不到此示例在何处允许您传递允许您的代码处理任何错误的回调这可能是在执行db调用之后发生的,而不是通常使用猫鼬完成它。

Ami*_*mir 7

我将解释 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);
Run Code Online (Sandbox Code Playgroud)

我不会解释控制器如何请求服务层来发布或接收数据。它只是从服务层调用一个方法。因此,在服务层内,例如 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));
  });
}
Run Code Online (Sandbox Code Playgroud)

现在我们将创建一个存储库,以便其他所有服务都可以调用该存储库来实现 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);
      });
  });
}
Run Code Online (Sandbox Code Playgroud)

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