在 Web 开发领域中,MongoDB 已经成为很多人选择的数据库,而 NestJS 作为 Node.js 的高度模块化框架,也需要与其进行无缝连接。幸运的是,npm 社区中已经有了许多优秀的 NestJS 连接 MongoDB 的 npm 包,其中就包括了本文要介绍的 nest-mongo。
安装与配置
首先,在你的项目目录中安装 nest-mongo:
npm i --save nestjs-typegoose typegoose @nestjs/mongoose nest-mongoose
同时,在你的模块中引入 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