Nest入门教程 - 模块

模块

模块是具有 @Module() 装饰器的类。 @Module() 装饰器提供了元数据,Nest 用它来组织应用程序结构。

每个 Nest 应用程序至少有一个模块,即根模块。根模块是 Nest 开始安排应用程序树的地方。事实上,根模块可能是应用程序中唯一的模块,特别是当应用程序很小时,但是对于大型程序来说这是没有意义的。在大多数情况下,您将拥有多个模块,每个模块都有一组紧密相关的功能

@module() 装饰器接受一个描述模块属性的对象:

   
providers 由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享
controllers 必须创建的一组控制器
imports 导入模块的列表,这些模块导出了此模块中所需提供者
exports 由本模块提供并应在其他模块中可用的提供者的子集。

默认情况下, 模块封装提供者。这意味着如果提供者即不是当前模块的一部分, 也不是从另外模块(已导入)导出的,那么它就是无法注入的。

功能模块

CatsController 和 CatsService 属于同一个应用程序域。 应该考虑将它们移动到一个功能模块下,即 CatsModule

cats/cats.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';@Module({controllers: [CatsController],providers: [CatsService],
})
export class CatsModule {}Copy to clipboardErrorCopied

要使用 CLI 创建模块,只需执行 $ nest g module cats 命令。

我已经创建了 cats.module.ts 文件,并把与这个模块相关的所有东西都移到了 cats 目录下。我们需要做的最后一件事是将这个模块导入根模块 (ApplicationModule)

app.module.ts

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';@Module({imports: [CatsModule],
})
export class ApplicationModule {}Copy to clipboardErrorCopied

现在 Nest 知道除了 ApplicationModule 之外,注册 CatsModule 也是非常重要的。 这就是我们现在的目录结构:

src
├──cats
│    ├──dto
│    │   └──create-cat.dto.ts
│    ├──interfaces
│    │     └──cat.interface.ts
│    ├─cats.service.ts
│    ├─cats.controller.ts
│    └──cats.module.ts
├──app.module.ts
└──main.tsCopy to clipboardErrorCopied

共享模块

在 Nest 中,默认情况下,模块是单例,因此您可以轻松地在多个模块之间共享同一个提供者实例。

实际上,每个模块都是一个共享模块。一旦创建就能被任意模块重复使用。假设我们将在几个模块之间共享 CatsService 实例。 我们需要把 CatsService 放到 exports 数组中,如下所示:

cats.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';@Module({controllers: [CatsController],providers: [CatsService],exports: [CatsService]
})
export class CatsModule {}Copy to clipboardErrorCopied

现在,每个导入 CatsModule 的模块都可以访问 CatsService ,并且它们将共享相同的 CatsService 实例。

模块导出

模块可以导出他们的内部提供者。 而且,他们可以再导出自己导入的模块。

@Module({imports: [CommonModule],exports: [CommonModule],
})
export class CoreModule {}Copy to clipboardErrorCopied

依赖注入

提供者也可以注入到模块(类)中(例如,用于配置目的):

cats.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';@Module({controllers: [CatsController],providers: [CatsService],
})
export class CatsModule {constructor(private readonly catsService: CatsService) {}
}Copy to clipboardErrorCopied

但是,由于循环依赖性,模块类不能注入到提供者中。

全局模块

如果你不得不在任何地方导入相同的模块,那可能很烦人。在 Angular 中,提供者是在全局范围内注册的。一旦定义,他们到处可用。另一方面,Nest 将提供者封装在模块范围内。您无法在其他地方使用模块的提供者而不导入他们。但是有时候,你可能只想提供一组随时可用的东西 - 例如:helper,数据库连接等等。这就是为什么你能够使模块成为全局模块。

import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';@Global()
@Module({controllers: [CatsController],providers: [CatsService],exports: [CatsService],
})
export class CatsModule {}Copy to clipboardErrorCopied

@Global 装饰器使模块成为全局作用域。 全局模块应该只注册一次,最好由根或核心模块注册。 在上面的例子中,CatsService 组件将无处不在,而想要使用 CatsService 的模块则不需要在 imports 数组中导入 CatsModule

使一切全局化并不是一个好的解决方案。 全局模块可用于减少必要模板文件的数量。 imports 数组仍然是使模块 API 透明的最佳方式。

动态模块

Nest 模块系统带有一个称为动态模块的功能。 它使您能够毫不费力地创建可定制的模块。 让我们来看看 DatabaseModule

import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';@Module({providers: [Connection],
})
export class DatabaseModule {static forRoot(entities = [], options?): DynamicModule {const providers = createDatabaseProviders(options, entities);return {module: DatabaseModule,providers: providers,exports: providers,};}
}Copy to clipboardErrorCopied

forRoot() 可以同步或异步(Promise)返回动态模块。

此模块默认定义了 Connection 提供者,但另外 - 根据传递的 options 和 entities - 创建一个提供者集合,例如存储库。实际上,动态模块扩展了模块元数据。当您需要动态注册组件时,这个实质特性非常有用。然后你可以通过以下方式导入 DatabaseModule

import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';@Module({imports: [DatabaseModule.forRoot([User])],
})
export class ApplicationModule {}Copy to clipboardErrorCopied

为了导出动态模块,可以省略函数调用部分:

import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';@Module({imports: [DatabaseModule.forRoot([User])],exports: [DatabaseModule],
})
export class ApplicationModule {}Copy to clipboardErrorCopied

译者署名

用户名 头像 职能 签名
@zuohuadong 翻译 专注于 caddy 和 nest,@zuohuadong at Github
@Armor 翻译 专注于 Java 和 Nest,@Armor
@Drixn 翻译 专注于 nginx 和 C++,@Drixn
@tangkai 翻译 专注于 React,@tangkai
@havef 校正 数据分析、机器学习、TS/JS技术栈 @havef

Nest入门教程 - 模块相关推荐

  1. Nest入门教程 - 初识Providers

    Nest入门教程 - 初识Providers Providers Providers 是 Nest 的一个基本概念.许多基本的 Nest 类可能被视为 provider - service,repos ...

  2. Nest入门教程 - 初识控制器

    Nest入门教程 - 初识控制器 控制器 控制器负责处理传入的 请求 和向客户端返回 响应 . 控制器的目的是接收应用的特定请求.路由机制控制哪个控制器接收哪些请求.通常,每个控制器有多个路由,不同的 ...

  3. 后端框架 Nest 入门教程: 开发学生信息管理系统

    作为一个前端,是否有想过学习下后端,做一个完整的应用? 如果你只是想体验下服务器端,可以选择 Express[1].它更容易上手.如果你想做一个企业级应用,推荐使用 Nest. Nest[2] (Ne ...

  4. 微软 MS Learn 上线 Blazor 入门教程

    微软官方学习网站 MS Learn 上线了 Blazor 入门教程模块,希望通过这个课程,让开发人员了解如何设置开发环境,以及如何使用 Blazor.Visual Studio Code 和 C# 生 ...

  5. Node.js 官网入门教程(一) CommonJS 模块规范、Node.js REPL、console、CLI、exports

    Node.js 官网入门教程(一) CommonJS 模块规范.Node.js REPL.console.CLI.exports 文章目录 Node.js 官网入门教程(一) CommonJS 模块规 ...

  6. python存款模块_python入门教程NO.8用python写个存款利息计算器

    python 入门教程 NO.8 用 python 写个存款利息计算器 本文涉及的 python 基础语法为 def 函数, return ,函数的各参数示例,匿名函数等 函数初识 函数是一段组织好的 ...

  7. python 三分钟入门_Cython 三分钟入门教程

    作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它 ...

  8. python爬虫入门教程--优雅的HTTP库requests(二)

    requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...

  9. 人人都能看懂的 Python 装饰器入门教程

    大家好,我是萱萱! 之前的文章中提到,很多人认为理解了装饰器的概念和用法后,会觉得自己的 Python 水平有一个明显的提高. 但很多教程在一上来就会给出装饰器的定义以及基本用法,例如你一定会在很多文 ...

最新文章

  1. Python文件的使用
  2. 数据蒋堂 | 大数据集群该不该透明化?
  3. python中.whl文件下载,pandas
  4. CompletableFuture API用法介绍(二)
  5. OAuth 2.0 扩展协议之 PKCE
  6. Android Studio打包和引用aar
  7. HDU 5573 Binary Tree 构造
  8. centos6.8 环境一键安装包 nginx配置thinkphp5
  9. 微信内打开的网页不能下载APP,微信无法打开浏览器访问指定页面的解决方案...
  10. 第二十八章:化学学校
  11. Python爬取Boss直聘,帮你获取全国各类职业薪酬榜
  12. java从包package中获取所有的Class
  13. 4.微服务:从设计到部署 --- 服务发现
  14. 结队编程与日程管理系统维护改善
  15. Qwins系统工具v1.3.0绿色版
  16. 【亲测可运营】PHP匿名在线聊天室/语音聊天室/多国语言版在线聊天室
  17. linux操作系统基础教程第二版附录答案,《linux操作系统》第2版完整习题答案 电子工业出版社.doc...
  18. win10下PHP开发环境搭建
  19. 练习三 HTML5 logo
  20. 文献阅读笔记(2022.11.14)

热门文章

  1. Vue系列Vue-cli 4配置别名(六)
  2. 授权(Authentication)
  3. linux: chmod,chown命令详解
  4. Shell编程: Shell 变量
  5. 15个友好的jQuery 提示框插件
  6. php 日期时间运算的小结(计算当前时间之后(之前)的时间)
  7. 使用U盘安装Fedora14 32bit操作系统(参考自www.osyunwei.com)
  8. 华为机试——计算字符个数
  9. 【Python AsciiArt】利用命令行打印出字符图案
  10. 记一次线上压测Dubbo线程池队列满的问题