使用mongoose的node.js存储库模式

jei2mxaa  于 2023-10-17  发布在  Node.js
关注(0)|答案(2)|浏览(119)

我是一个node.js的新手,来自.net背景。我想使用一些我在c#. net中使用的设计模式。然而,由于C#和JavaScript之间面向对象的本质差异,我遇到了一些复杂的问题。
特别是,我想实现存储库模式,但还没有找到很多用node实现的例子。JavaScript和mongoose的设置方式让我有点难以理解这一点。
我参考了下面的一个例子https://github.com/iainjmitchell/mongorepositiory的URL,我可能是错的,但我不明白这个例子允许你传递回调,允许你的代码处理数据库调用后可能出现的任何错误,而不是通常使用mongoose。

9udxz4iz

9udxz4iz1#

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

  • 控制器
  • 服务
  • 存储库

让我们首先使用mongoose模式建立我们的模型。这是在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);
      });
  });
}

就这样。我已经尽可能简单地解释了。您可能需要配置其他设置,如连接到数据库。但是如果你能做到这一点,你就可以向存储库添加其他功能。

hof1towb

hof1towb2#

几个月前,我自己也问过同样的问题,经过一些研究和努力,我创建了monguito,一个轻量级的、类型安全的MongoDB抽象仓库实现,用于Node.js。
此外,monguito是一个开源的Mongoose ODM Package 器,具有几个很酷的内置特性,包括在NestJS应用程序中的轻松集成,polymorphic data model handling support和可选的审计数据支持。快来看看here

相关问题