首页 > 其他分享 >Nestjs系列 Nestjs基础(二)

Nestjs系列 Nestjs基础(二)

时间:2024-03-03 17:55:36浏览次数:19  
标签:PersonService 系列 providers provide 基础 Module person Nestjs 模块

providers 使用

该内容可以结合 Nestjs 中文网-自定义提供者 查看

创建一个 nest 项目,创建一个 Person crud模块。

providers 写法

providers 完整和简写

image

@Injectable() 装饰器将 PersonService 类标记为提供者。然后在 Module 中声明,即和 PersonService 做关联,个人感觉 providers 的主要作用就是去关联 Service 层。
providers 有两种写法,简化写法 和 完整写法,常用是简化写法

// 简化写法
@Module({
  providers: [PersonService],
})
// 完整写法
@Module({
  providers: [
    {
      provide: PersonService,
      useClass: PersonService,
    },
  ],
})

而在 Module 中关联 Service 之后,Nest 就会自动做实例化并注入。
Controller 层在使用时,会自动注入
image

如果不想使用 constructor 构造器注入,也可以手动注入

@Controller('person')
export class PersonController {
  @Inject(PersonService)
  private readonly personService: PersonService;
  // constructor(private readonly personService: PersonService) {}

  @Get()
  findAll() {
    return this.personService.findAll();
  }
}

providers 的属性

token 字符串写法

providers 的完整写法中,provide 通常是 xxxService,也就是 class,但也可以是字符串

image

调试,可以得出该方法也同样可以注入

image

当使用完整写法,且 provide 声明的 token 是字符串时,必须手动 @Inject 注入 token,不简洁,因此该方式并不常用

useValue

对模块提供部分静态数据,可以使用 useValue

  providers: [
    {
      provide: 'person_static_value',
      useValue: {
        name: '张三',
        age: 20,
      },
    },
  ],

image

切记,一个 provide 中,useClassuseValue 不能同时出现,否则 useValue 无效

image

useFactory

useValue 提供的是静态值,useFactory 提供的就是动态值,类似于工厂模式,对于工厂模式的应用可阅读 该掘金作者文章

  providers: [
    {
      provide: 'person_factory',
      useFactory() {
        const a = 10;
        if (a == 10) {
          return { cat: '狸花', dog: '土狗',};
        }
        return {};
      },
    },
  ],

image

同时,useFactory 也支持异步注入

const sleep = (time = 1000) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({ cat: '狸花', dog: '土狗' });
    }, time);
  });
};

  providers: [
    {
      provide: 'person_factory',
      useFactory: async () => {
        const res = await sleep(5000);
        return res;
      },
    },
  ],

以上例子中,useFactory 在 5s 后返回数据,则注入也是在 5s 后执行,在这 5s 期间,断点处是没有 this 的,也就是没有执行注入。

inject

useFactory 函数是可以接收参数的,其参数就是通过 inject 注入的

  providers: [
    PersonService,
    {
      provide: 'person_static_value',
      useValue: {
        name: '张三',
        age: 20,
      },
    },
    {
      provide: 'person_factory',
	  // 注入了两个 token,分别是 person_static_value 和 PersonService
      inject: ['person_static_value', PersonService],
      useFactory: async (
        person: { name: string; age: number },
        personService: PersonService,
      ) => {
        return {
          personName: person.name,
          hello: personService.findAll(),
        };
      },
    },
  ],

image

useExisting

大概作用就是对一个已有的 token 起一个别名,比如将 A 起个别名 A1,那么在使用 A1 作为 token 注入是,实际也是注入的 A

image

全局模块和生命周期

全局模块

当某些模块,比如 CommonService 本身就属于公用模块,但是每次在其它 Service 中使用时,都需要在 Module 中 imports 导入,数量多的话就较为繁琐,此时就可以把该模块设置为全局模块,使其在全局设置一次,即可所有模块共用。

比如 PersonService 需要使用 的方法,正常注入其它模块,需要以下步骤:

image

若是公共模块,每个模块都 imports 太麻烦了,此时可以把它声明为全局的

声明为全局模块

使用 @Global() 装饰器即可将模块声明为全局的,此时就不用 imports 就可以直接 @Inject 注入了。

@Global()
@Module({
  controllers: [AnimalController],
  providers: [AnimalService],
  exports: [AnimalService],
})

image

但是全局模块尽量少使用,不然项目庞大之后,内部注入的全局模块很难找到来源

生命周期

详情可查看 Nest 中文网-生命周期事件该章节强烈建议读文档

image

启动生命周期

启动时的生命周期有两个 onModuleInitonApplicationBootstrap

  • 首先会递归模块(Module),依次调用模块内的 controllerprovideronModuleInit 方法,然后再调用 module 的 onModuleInit 方法
  • 全部初始化完之后,再依次调用模块内的 controllerprovideronApplicationBootstrap 方法,然后调用 module 的 onApplicationBootstrap 方法
  • 然后监听网络端口
  • Nest 程序正常运行

将 Person 模块的 controllerservicemodule 中都继承 onModuleInitonApplicationBootstrap
image

Animal 模块操作同上图,
得到的打印结果是:

image

销毁生命周期

只有显示的使用 app.close() 才会触发销毁的生命周期,但 app.close() 只会触发销毁生命周期,不会终止 Node 进程

image

销毁时的生命周期有三个 onModuleDestroy beforeApplicationShutdown onApplicationShutdown

  • 先调用每个模块的 controllerprovideronModuleDestroy 方法,然后调用 Module 的 onModuleDestroy 方法。
  • 之后再调用每个模块的 controllerproviderbeforeApplicationShutdown 方法,然后调用 Module 的 beforeApplicationShutdown 方法。
  • 然后停止监听网络端口。
  • 之后调用每个模块的 controllerprovideronApplicationShutdown 方法,然后调用 Module 的 onApplicationShutdown 方法。
  • 之后停止进程。

先让两个模块的 controllersevicemodule 继承 onModuleDestroy beforeApplicationShutdown onApplicationShutdown

image

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);

  setTimeout(() => {
    app.close();  // 显式销毁
  }, 5000);
}

image

标签:PersonService,系列,providers,provide,基础,Module,person,Nestjs,模块
From: https://www.cnblogs.com/jsonq/p/18049416

相关文章

  • 【Java基础】Maven入门笔记
    本篇笔记参考尚硅谷Maven课程,概括总结了Maven的核心功能Maven仓库地址:MavenRepository:Search/Browse/Explore一、Maven简介1.Maven是一个依赖管理工具、构建工具2.Maven介绍Maven是一款为Java项目管理构建、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打......
  • 云原生基础设施代码化-terragrunt处理
    Terragrunt是什么?Terragrunt是一个基于Terraform的开源工具,它通过向Terraform添加一些额外的功能来帮助管理和组织Terraform代码。它提供了许多功能,包括:DRY(Don’tRepeatYourself):使用Terragrunt可以减少Terraform代码冗余。例如,您可以将共享的配置块抽象为公共模块,然后在需......
  • Day01---Web前端基础
    1,换行,分割和超链接换行命令:分隔线命令:超链接命令:超链接有两种常用用法:页面跳转,下载文件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><!--页面跳转:如果href的值是网......
  • web前端基础
    常见的标签使用标题和段落<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><!--HTML中的标签是HTML语法提供的,所以每一个标签都是固定标签名--><h1>......
  • Windows基础
    NTLM协议LM加密算法  LMHash的明文密码被限制在14位以内。如果LMHash的值为aad3b435b51404eeaad3b435b51404ee,说明LMHasg为空或者被禁用了。加密流程  以P@ss1234来演示LMHash的加密流程:    1)将用户的明文口令转化为大写,并转化为16进制字符串。   ......
  • Markdown基础语法学习小结
    一、前言Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。--摘自百度百科对于程序员来说,学习并记录到博客中是非常好的学习习惯,能提升学习效果,本来想要自己搭建一个博客网站,但重心在于学习上,就不花太多时间精力......
  • 对于 Windows 系统的入侵排查,以下是一些基础的排查方法
    对于Windows系统的入侵排查,以下是一些基础的排查方法:检查系统日志:WindowsEventViewer中有各种日志,包括安全日志、应用程序日志等。检查这些日志是否有异常登录、异常操作等记录。扫描恶意软件:运行杀毒软件和反间谍软件来扫描系统,确保系统没有受到恶意软件感染。......
  • 对于Windows系统的入侵痕迹溯源,以下是一些基础技术原理
    对于Windows系统的入侵痕迹溯源,以下是一些基础技术原理:日志分析:通过分析Windows系统的各类日志,包括安全日志、事件日志、系统日志等,可以追踪潜在的入侵行为和异常活动。关注登录记录、权限变更、文件访问等操作,以发现不明示的活动。网络流量分析:监控网络流量,并分析与Windows......
  • Windows 系统日志是记录操作系统活动的重要组成部分,对于入侵排查和溯源来说,分析系统日
    Windows系统日志是记录操作系统活动的重要组成部分,对于入侵排查和溯源来说,分析系统日志是非常关键的一步。以下是针对Windows系统日志分析和溯源的基础技术原理:事件日志:Windows操作系统生成多个类型的事件日志,包括应用程序日志、安全日志和系统日志。了解不同类型的事件日......
  • ElasticSearch系列---【linux离线安装elasticsearch7.8集群】
    linux离线安装elasticsearch7.81.官网下载地址https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-02.上传到服务器指定目录例如这里我上传到/opt/app/middles/目录下3.解压软件#解压缩tar-zxvfelasticsearch-7.8.0-linux-x86_64.tar.gz4.创建用户......