Nest入门教程 - 模块
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.ts
Copy 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入门教程 - 模块相关推荐
- Nest入门教程 - 初识Providers
Nest入门教程 - 初识Providers Providers Providers 是 Nest 的一个基本概念.许多基本的 Nest 类可能被视为 provider - service,repos ...
- Nest入门教程 - 初识控制器
Nest入门教程 - 初识控制器 控制器 控制器负责处理传入的 请求 和向客户端返回 响应 . 控制器的目的是接收应用的特定请求.路由机制控制哪个控制器接收哪些请求.通常,每个控制器有多个路由,不同的 ...
- 后端框架 Nest 入门教程: 开发学生信息管理系统
作为一个前端,是否有想过学习下后端,做一个完整的应用? 如果你只是想体验下服务器端,可以选择 Express[1].它更容易上手.如果你想做一个企业级应用,推荐使用 Nest. Nest[2] (Ne ...
- 微软 MS Learn 上线 Blazor 入门教程
微软官方学习网站 MS Learn 上线了 Blazor 入门教程模块,希望通过这个课程,让开发人员了解如何设置开发环境,以及如何使用 Blazor.Visual Studio Code 和 C# 生 ...
- Node.js 官网入门教程(一) CommonJS 模块规范、Node.js REPL、console、CLI、exports
Node.js 官网入门教程(一) CommonJS 模块规范.Node.js REPL.console.CLI.exports 文章目录 Node.js 官网入门教程(一) CommonJS 模块规 ...
- python存款模块_python入门教程NO.8用python写个存款利息计算器
python 入门教程 NO.8 用 python 写个存款利息计算器 本文涉及的 python 基础语法为 def 函数, return ,函数的各参数示例,匿名函数等 函数初识 函数是一段组织好的 ...
- python 三分钟入门_Cython 三分钟入门教程
作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它 ...
- python爬虫入门教程--优雅的HTTP库requests(二)
requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...
- 人人都能看懂的 Python 装饰器入门教程
大家好,我是萱萱! 之前的文章中提到,很多人认为理解了装饰器的概念和用法后,会觉得自己的 Python 水平有一个明显的提高. 但很多教程在一上来就会给出装饰器的定义以及基本用法,例如你一定会在很多文 ...
最新文章
- Python文件的使用
- 数据蒋堂 | 大数据集群该不该透明化?
- python中.whl文件下载,pandas
- CompletableFuture API用法介绍(二)
- OAuth 2.0 扩展协议之 PKCE
- Android Studio打包和引用aar
- HDU 5573 Binary Tree 构造
- centos6.8 环境一键安装包 nginx配置thinkphp5
- 微信内打开的网页不能下载APP,微信无法打开浏览器访问指定页面的解决方案...
- 第二十八章:化学学校
- Python爬取Boss直聘,帮你获取全国各类职业薪酬榜
- java从包package中获取所有的Class
- 4.微服务:从设计到部署 --- 服务发现
- 结队编程与日程管理系统维护改善
- Qwins系统工具v1.3.0绿色版
- 【亲测可运营】PHP匿名在线聊天室/语音聊天室/多国语言版在线聊天室
- linux操作系统基础教程第二版附录答案,《linux操作系统》第2版完整习题答案 电子工业出版社.doc...
- win10下PHP开发环境搭建
- 练习三 HTML5 logo
- 文献阅读笔记(2022.11.14)
热门文章
- Vue系列Vue-cli 4配置别名(六)
- 授权(Authentication)
- linux: chmod,chown命令详解
- Shell编程: Shell 变量
- 15个友好的jQuery 提示框插件
- php 日期时间运算的小结(计算当前时间之后(之前)的时间)
- 使用U盘安装Fedora14 32bit操作系统(参考自www.osyunwei.com)
- 华为机试——计算字符个数
- 【Python AsciiArt】利用命令行打印出字符图案
- 记一次线上压测Dubbo线程池队列满的问题