npm 包 nest-mongo 使用教程

阅读时长 14 分钟读完

在 Web 开发领域中,MongoDB 已经成为很多人选择的数据库,而 NestJS 作为 Node.js 的高度模块化框架,也需要与其进行无缝连接。幸运的是,npm 社区中已经有了许多优秀的 NestJS 连接 MongoDB 的 npm 包,其中就包括了本文要介绍的 nest-mongo。

安装与配置

首先,在你的项目目录中安装 nest-mongo:

同时,在你的模块中引入 Mongoose 和 nest-mongoose:

-- -------------------- ---- -------
------ - -------------- - ---- -------------------
------ - ------------ - ---- ----------------

---------
  -------- -
    ---------------------------------------------------- -
      ---------------- -----
      ------------------- -----
    ---
    -------------
  --
--
------ ----- --------- --

接下来,定义一个与 MongoDB 中集合对应的类。例如,我们定义了一个名为 Cat 的集合。那么对应的类应该长这样:

-- -------------------- ---- -------
------ - ---- - ---- -----------------------

------ ----- --- -
  ------- --------- ----- ------- ---- --
  ----- -------

  -------
  ---- -------

  -------
  ------ -------
-

这里使用了 typegoose 库来实现方便的类型转换。prop 装饰器定义了 Cat 中的每个属性,同时提供了一些选项。例如 required 表示该属性非空,unique 表示该属性在集合中唯一。

当然,如果你的项目中使用了 DTO,你也可以将 prop 装饰器改为 apiProperty 装饰器以符合 RESTful 标准。

基本用法

在定义了 Cat 类之后,我们就可以在服务中使用它了。使用 NestJS 的依赖注入特性,我们可以定义一个 CatsService:

-- -------------------- ---- -------
------ - ---------- - ---- -----------------
------ - ----------- - ---- -------------------
------ - ----- - ---- -----------
------ - --- - ---- ---------------

-------------
------ ----- ----------- -
  ---------------------------------- ------- -------- --------- ----------- --

  ----- ----------- ----- ------------ -
    ----- ---------- - --- -------------------
    ------ ------------------
  -

  ----- ---------- -------------- -
    ------ ----------------------------
  -
-

你需要引入 Injectable 装饰器,告诉 NestJS 这是一个可以被注入到其他模块中的服务。同时,使用 @InjectModel(Cat.name) 将 Cat 类明确指定为注入模块,并且用 this.catModel 引用它。

现在,我们实现了 CatService 的基本方法,可以通过 create 方法向 MongoDB 中添加 Cat 数据,通过 findAll 方法查询所有数据。

高级用法

事务

在实际开发中,我们常常需要使用事务来确保数据的正确性。而 nest-mongo 也为我们提供了事务的支持。

首先需要在 app.module 中引入 TransactionMiddleware:

-- -------------------- ---- -------
------ - --------------------- - ---- -----------------------------
---------
  -------- -
    ---------------------------------------------------- -
      ---------------- -----
      ------------------- -----
    ---
    ----------------------
      ---------------------- -----
    ---
  --
  ---------- ------------------------
--
------ ----- --------- --

在 CatService 中,使用 Transaction 装饰器来标记需要进行事务处理的方法:

-- -------------------- ---- -------
------ - ------------ ------------------ - ---- -----------------------------

-------------
------ ----- ----------- -
  ---------------------------------- ------- -------- --------- ----------- --

  --------------
  ----- ----------------------
    ---- ----
    --------------------- ---------
  -- ------------ -
    ----- ---------- - --- -------------------
    ------ -------------------------
  -
-

分页

在实际开发中,我们常常需要对数据进行分页查询。 nest-mongo 也提供了分页的支持。

-- -------------------- ---- -------
------ - -------------- ------------ - ---- ----------------

-------------
------ ----- ----------- -
  ---------------------------------- ------- -------- --------- ----------- --

  ----- ------------------
    -------------- --------------
  -- -------------------------- -
    ----- ----- - -----------------------
    ------ ------------------------------
  -
-

国际化

最后,在实际开发中,我们应该考虑支持多国语言。 nest-mongo 中优雅地解决了这个问题。

-- -------------------- ---- -------
------ - ------------ ------------------ - ---- ----------------------
------ - ------------------ - ---- ----------------
------ - --- - ---- ---------------

--------------
  -- ------
  ----------- --------------- ----------
  -- ------
  ------------ -----
--
---------
  -------- -
    -------------------------------- ----- --------- ------- --------- ----
  --
--
------ ----- ---------- -
  ------------
    ------- -------- ------------------- -------------------
    -- -- ------------------- --
    ------- -------- -------------------- --------------------
  - -
    -- ------
    ----------------------------------------------- ----------
    -- ------
    ------------------------------------------------
    -- -- --------------------- ------
    ----------------------------------------
      ----------- --------------- ----------
      -- ------
      ------------ --------
    ---
  -
-

示例代码

这里为大家提供一个完整的示例代码:

app.module.ts

-- -------------------- ---- -------
------ - ------ - ---- -----------------
------ - -------------- - ---- -------------------
------ - ------------ - ---- ----------------
------ - ---------- - ---- ---------------------

---------
  -------- -
    ---------------------------------------------------- -
      ---------------- -----
      ------------------- -----
    ---
    ----------------------
      ---------------------- -----
    ---
    -----------
  --
--
------ ----- --------- --

cat.schema.ts

-- -------------------- ---- -------
------ - ----------- - ---- ------------------
------ - ---- - ---- -----------------------

------ ----- --- -
  --------------
  ------- --------- ----- ------- ---- --
  ----- -------

  --------------
  -------
  ---- -------

  --------------
  -------
  ------ -------
-

cats.service.ts

-- -------------------- ---- -------
------ - ---------- - ---- -----------------
------ - ----------- - ---- -------------------
------ - ------------ ------------------ - ---- -----------------------------
------ - ----- - ---- -----------
------ - -------------- ------------ - ---- ----------------
------ - --- - ---- ---------------

-------------
------ ----- ----------- -
  ---------------------------------- ------- -------- --------- ----------- --

  ----- ----------- ----- ------------ -
    ----- ---------- - --- -------------------
    ------ ------------------
  -

  ----- ---------- -------------- -
    ------ ----------------------------
  -

  --------------
  ----- ----------------------
    ---- ----
    --------------------- ---------
  -- ------------ -
    ----- ---------- - --- -------------------
    ------ -------------------------
  -

  ----- ------------------
    -------------- --------------
  -- -------------------------- -
    ----- ----- - -----------------------
    ------ ------------------------------
  -
-

cats.module.ts

-- -------------------- ---- -------
------ - ------- ------ - ---- -----------------
------ - ------------ ------------------ - ---- ----------------------
------ - ---- - ---- -------
------ - ------------------ - ---- ----------------
------ - -------------- - ---- --------------------
------ - ----------- - ---- -----------------
------ - ---- --------- - ---- ---------------

---------
--------------
  ----------- --------------- ----------
  ------------ -----
--
---------
  -------- -
    -------------------------------- ----- --------- ------- --------- ----
  --
  ------------ -----------------
  ---------- --------------
--
------ ----- ---------- -
  ------------
    ------- -------- ------------------- -------------------
    ------- -------- -------------------- --------------------
  - -
    ----------------------------------------------- ----------
    ------------------------------------------------
    ----------------------------------------
      ----------- --------------- ----------
      ------------ --------
    ---
  -
-

cats.controller.ts

-- -------------------- ---- -------
------ -
  -----
  -----------
  ----
  -----
  ---------
  ---------------
- ---- -----------------
------ - ------- - ---- ------------------
------ - ----------- - ---- ----------------------
------ - -------------- ------------ - ---- ----------------
------ - --- - ---- ---------------
------ - ----------- - ---- -----------------

--------------
----------------
-------------------
------ ----- -------------- -
  ------------------- -------- ------------ ------------ --

  -------
  ------------- -----------------
  ----- -------------- ---- ----- ------------ -
    ------ -----------------------------
  -

  ------
  ----- ---------- -------------- -
    ------ ---------------------------
  -

  ------------
  ------------- -----------------
  ----- ----------------------------- ---- ----- ------------ -
    ------ --------------------------------------------
  -

  ---------------
  ----- ------------------
    ----- -------
    ------ -------
  -- -------------------------- -
    ----- ------------- - -
      -----
      ------
    - -- --------------
    ------ --------------------------------------------------
  -
-

这样,我们就成功地基于 NestJS 和 nest-mongo 实现了一个可供开发者使用的 MongoDB 连接层,减少了项目中大量的基础代码编写。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60056cd581e8991b448e66c9

纠错
反馈