返回顶部
首页 > 资讯 > 精选 >Nest.js系列之Providers及模块功能怎么使用
  • 696
分享到

Nest.js系列之Providers及模块功能怎么使用

2023-07-05 08:07:27 696人浏览 薄情痞子
摘要

这篇文章主要介绍“Nest.js系列之Providers及模块功能怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Nest.js系列之Providers及模块功能怎么使用”文章能帮助大家解决问

这篇文章主要介绍“Nest.js系列之Providers及模块功能怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Nest.js系列之Providers及模块功能怎么使用”文章能帮助大家解决问题。

提供者

ProvidersNest的一个基本概念。提供者是一个大的分类,比如sevicerepositoryfactoryhelper等都是提供者。可以通过constructor注入依赖关系。对象之间可以创建各种关系。提供者只是一个用@Injectable()装饰的类

Nest.js系列之Providers及模块功能怎么使用

在控制器的文章中,知道了如何创建一个简单的控制器,控制器中不应该包含过多的复杂任务处理逻辑,这部分的任务逻辑处理应该交给Providers

因为Nest可以面向对象的方式设计和组织依赖性,所以强烈建议遵循SOLID原则

什么是SOLID原则

SOLID 原则其实是用来指导软件设计的,它一共分为五条设计原则,分别是:

  • 单一职责原则(SRP)

  • 开闭原则(OCP)

  • 里氏替换原则(LSP)

  • 接口隔离原则(ISP)

  • 依赖倒置原则(DIP)

服务

从创建一个简单的服务开始,服务由控制器使用,服务其实也是一个提供者

import { Injectable } from '@nestjs/common';import { User } from './interfaces/user.interface';@Injectable()export class UsersService {  private readonly users: User[] = [];  create(user: User) {    this.users.push(user);  }  findAll(): User[] {    return this.users;  }}

之前文章提到过可以使用命令快速创建一个服务 nest g service users

控制器中如何使用服务

import { Controller, Get, Post, Body } from '@nestjs/common';import { CreateUserDto } from './dto/create-user.dto';import { UsersService } from './users.service';import { User } from './interfaces/user.interface';@Controller('users')export class CatsController {  constructor(private usersService: UsersService) {}  @Post()  async create(@Body() createUserDto: CreateUserDto) {    this.usersService.create(createUserDto);  }  @Get()  async findAll(): Promise<User[]> {    return this.usersService.findAll();  }}

通过实例可以看出,控制器如果想要使用服务,只需要将服务通过依赖注入的方式注入到控制器中

constructor(private usersService: UsersService) {}

依赖注入

Nest 是建立在强大的设计模式,通常称为依赖注入。我们建议在官方的 angular文档中阅读有关此概念的精彩文章。

在 Nest 中,借助 TypeScript 功能,管理依赖项非常容易,因为它们仅按类型进行解析。在下面的示例中,Nest 将 catsService 通过创建并返回一个实例来解析 CatsService(或者,在单例的正常情况下,如果现有实例已在其他地方请求,则返回现有实例)。解析此依赖关系并将其传递给控制器的构造函数(或分配给指定的属性):

constructor(private readonly catsService: CatsService) {}

注册提供者

现在我们已经定义了提供者(UsersService),并且已经有了该服务的使用者(UsersController),我们需要在 Nest 中注册该服务,以便它可以执行注入。 为此,我们可以编辑模块文件(app.module.ts),然后将服务添加到@Module()装饰器的 providers 数组中。

import { Module } from '@nestjs/common';import { UsersController } from './users/users.controller';import { UsersService } from './users/users.service';@Module({  controllers: [UsersController],  providers: [UsersService],})export class AppModule {}

小结

提供者可以简单理解为是服务,但是毕竟服务只是一种提供者。在nest中通过使用服务来做逻辑处理。

模块

什么是模块

模块是具有@Module()装饰器的类,Nest使用模块来组织代码

Nest.js系列之Providers及模块功能怎么使用

每个nest程序至少有一个模块,也就是根模块。但是这是对于小应用来说的,对于大型程序来说,会拥有多个模块,每个模块拥有自己的功能。 @Module()装饰器接受属性对象

  • providers 由nest注入器实例化的提供者,并且可以至少在整个模块中共享

  • controllers 必须创建的控制器

  • imports 导入模块的列表,这些模块导出了此模块中所需要的提供者

  • exports 本模块导出的可以用于其他模块的提供者

默认情况下,该模块封装提供程序。这意味着无法注入既不是当前模块的直接组成部分,也不是从导入的模块导出的提供程序。因此,您可以将从模块导出的提供程序视为模块的公共接口或api

功能模块

通常来说,一个功能对应一个模块,比如UsersControllerUsersService应该属于一个模块,该模块就称为功能模块

users/users.module.ts

import { Module } from '@nestjs/common'; import { UsersController } from './users.controller'; import { UsersService } from './users.service'; @Module({     controllers: [UsersController],     providers: [UsersService], }) export class UsersModule {}

可以使用cli命令来创建一个模块

nest g module cats

当写好一个功能模块之后,要把模块导入到根模块

import {Module} from '@nestjs/common';import {UsersModule} from './users/users.module';@Module({    imports: [CatsModule],})export class ApplocationModule {}

共享模块

nest默认情况下,模块是单例,因此可以很轻松的在多个模块之间共享同一个提供者实例

Nest.js系列之Providers及模块功能怎么使用

其实在nest中,每个模块都是共享模块,可以被任意模块重复使用。但是如果要在几个模块共享某一个服务,比如UsersService,那就需要在它所属的模块中导出这个服务,放到exports数组中

import { Module } from '@nestjs/common'; import { UsersController } from './users.controller'; import { UsersService } from './users.service'; @Module({     controllers: [UsersController],     providers: [UsersService],     exports: [UsersService] }) export class UsersModule {}

每个导入UsersModule的模块都可以访问UsersService

模块的导出与导入

模块不仅可以导出提供者,而且还可以导出自己导入的模块

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

依赖注入

提供者也可以注入到模块中

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

全局模块

有时候需要在任何地方导入相同的模块,如果每个模块都导入,就会很繁琐,所以就有了全局模块

import { Module, Global } from '@nestjs/common'; import { UsersController } from './users.controller'; import { UsersService } from './users.service'; @Global() @Module({     controllers: [UsersController],     providers: [UsersService],     exports: [UsersService], }) export class UsersModule {}

@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 默认情况下(在 @Module() 装饰器元数据中)定义提供程序,但此外-根据传递给方法的 entities 和 options 对象 forRoot() -公开提供程序的集合,例如存储库。请注意,动态模块返回的属性扩展(而不是覆盖)@Module() 装饰器中定义的基本模块元数据。这就是从模块导出静态声明的 Connection 提供程序和动态生成的存储库提供程序的方式。

如果要在全局范围内注册动态模块,请将 global 属性设置为 true

{  global: true,  module: DatabaseModule,  providers: providers,  exports: providers,}Copy to clipboardErrorCopied

如上所述,将所有内容全局化不是一个好的设计决策。

所述 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 AppModule {}Copy to clipboardErrorCopied

如果要依次重新导出动态模块,则可以 forRoot() 在导出数组中省略方法调用:

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 AppModule {}

关于“Nest.js系列之Providers及模块功能怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Nest.js系列之Providers及模块功能怎么使用

本文链接: https://www.lsjlt.com/news/350668.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Nest.js系列之Providers及模块功能怎么使用
    这篇文章主要介绍“Nest.js系列之Providers及模块功能怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Nest.js系列之Providers及模块功能怎么使用”文章能帮助大家解决问...
    99+
    2023-07-05
  • Nest.js系列之Providers及模块功能使用详解
    目录提供者什么是SOLID原则服务控制器中如何使用服务依赖注入注册提供者小结模块什么是模块功能模块共享模块模块的导出与导入依赖注入全局模块动态模块总结提供者 Providers是N...
    99+
    2023-03-03
    Nest.js Providers模块功能 Nest.js Providers
  • Python序列化模块之pickle与json怎么使用
    本篇内容主要讲解“Python序列化模块之pickle与json怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python序列化模块之pickle与json怎么使用”吧!序列化模块imp...
    99+
    2023-06-30
  • Python之datetime模块怎么使用
    这篇文章主要讲解了“Python之datetime模块怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python之datetime模块怎么使用”吧!1、日期时间对象日期时间对象是指具...
    99+
    2023-07-02
  • Python基础之模块怎么使用
    这篇文章主要介绍“Python基础之模块怎么使用”,在日常操作中,相信很多人在Python基础之模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python基础之模块怎么使用”的疑惑有所帮助!接下来...
    99+
    2023-07-06
  • Linux系统怎么使用lsmod命令列出内核模块
    这篇文章主要介绍Linux系统怎么使用lsmod命令列出内核模块,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!lsmod是一个命令行实用程序,用于显示有关已加载的Linux内核模块的信息。内核模块内核是操作系统的核心...
    99+
    2023-06-28
  • python ffmpeg模块怎么安装及使用
    要安装和使用Python的ffmpeg模块,您可以按照以下步骤进行操作:1. 首先,确保您已经安装了ffmpeg程序。您可以从ffm...
    99+
    2023-10-20
    python ffmpeg
  • python爬虫之selenium模块怎么使用
    这篇文章主要介绍了python爬虫之selenium模块怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python爬虫之selenium模块怎么使用文章都会有所收获,下面我们一起来看看吧。一、什么是Se...
    99+
    2023-06-30
  • Python常用标准库之os模块与shutil模块怎么使用
    本文小编为大家详细介绍“Python常用标准库之os模块与shutil模块怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python常用标准库之os模块与shutil模块怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-30
  • Node.js怎么使用文件系统模块
    这篇文章主要介绍“Node.js怎么使用文件系统模块”,在日常操作中,相信很多人在Node.js怎么使用文件系统模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node.j...
    99+
    2024-04-02
  • node的path模块是什么及怎么使用
    这篇“node的path模块是什么及怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node的path模块是什么及怎么...
    99+
    2023-07-04
  • 经典算法系列之KMP算法的原理及功能是什么
    KMP算法是一种字符串匹配算法,它的功能是在一个文本串中查找一个模式串的出现位置。KMP算法的原理是利用模式串内部的信息,即前缀和后...
    99+
    2023-09-22
    KMP算法
  • 怎么在python中使用translate模块实现一个翻译功能
    怎么在python中使用translate模块实现一个翻译功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、...
    99+
    2023-06-14
  • Python Flask框架模块怎么安装及使用
    这篇文章主要介绍“Python Flask框架模块怎么安装及使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python Flask框架模块怎么安装及使用”文章能帮助大家解决问...
    99+
    2023-07-05
  • kernel模块怎么在Linux系统中使用
    今天就跟大家聊聊有关kernel模块怎么在Linux系统中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. Linux内核设计:单内核、模块化(动态装载和卸载)(1) Linu...
    99+
    2023-06-12
  • python标准库模块之json库怎么使用
    今天小编给大家分享一下python标准库模块之json库怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言json,...
    99+
    2023-07-02
  • Python之Pygame的Event事件模块怎么使用
    Pygame的Event事件模块事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如常用的鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等,这些都可以看做是“事件”。 事件类型Pyg...
    99+
    2023-05-18
    Python Pygame event
  • Node.js中的http模块是什么及怎么使用
    本篇内容介绍了“Node.js中的http模块是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是http在百度百科的解...
    99+
    2023-07-04
  • Node.js中ES6模块化及Promise对象怎么使用
    本文小编为大家详细介绍“Node.js中ES6模块化及Promise对象怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node.js中ES6模块化及Promise对象怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-02
  • Python文件系统模块pathlib库怎么使用
    一、pathlib库官方定义pathlib 是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径)。pathlib 提供表示文件系统路径的类,其语义适...
    99+
    2023-05-14
    Python pathlib
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作