前言✌️✌️
JS不仅可以用来做前端,做后端也是可以的,尤其是对于主要学习前端的同学,不想再花费精力开一门语言,那么我们就可以直接使用JS做后端,在学习过nodejs以及koa,express的前提下,我决定学习nestjs
介绍一下🍆🍆
首先很多小伙伴肯定会有疑问,什么是nestjs?他和koa,express这些node框架有什么不同?
- 首先nestjs是一个可以构建高效可扩展的的一个Nodejs开发框架,在学习使用前面两个框架之后,现在看来感觉nestjs的生态真的要更加丰富一下,集成了前面框架的优点,又有很多突破。
- 并且nestjs支持typescript开发并且结合了AOP面向切面的编程方式,并且nestjs还是一个spring MVC风格,他包含了例如依赖注入,并且有模块化的思想,这些做的都是比较好的。
- 当然,nestjs的底层还是运用了比如express和fastify,并且在这些优秀框架的基础之上又有自己的扩展。
以上就是nestjs的一个简单介绍,不知道看完的小伙伴们有没有想要学习的冲动呢?让我们一起来学习这个框架吧。
相关文档推荐:
nestjs中文文档
一些前置的知识:🎄🎄
在正式学习之前,我们需要知道了解一下的概念:依赖注入,装饰器,那么话不多说我们开始学习
依赖注入
我们直接使用代码来演示一下:
class A { name: string; constructor(name: string) { this.name = name; } } class C { name: string; constructor(name: string) { this.name = name; } } class Container { mo: any; get(key: string) { return this.mo[key]; } provide(key: string, mo: any) { this.mo[key] = mo; } } const mo = new Container(); mo.provide("a", new A("xiis")); mo.provide("c", new A("sder")); class B { a: any; c: any; constructor(mo: Container) { this.a = mo.get("a"); } }
这里面我们使用了Container控制器,这个控制器中我们注入了上面写好的两个类A和C,这样在注入到控制器中,我们在B这个类中就可以通过控制器来调用获取这两个类,这就是依赖注入的简单实现,其实就是通过Provide注册类,然后再其他的类中就可以使用这个注册的类的方法。
装饰器
这部分知识我在TS的重新学习(四)这篇文章中讲到了,大伙不懂的可以看这篇文章,这里就不展开来讲解了。
初始化✒️✒️
在学习之前我们要先进行初始化的工作
我们使用nestcli创建项目会非常简单,那么首先我们先来下载相关的包
npm i -g @nestjs/cli
然后我们就可以初始化项目了
nest new project-name
这里的project-name
是我们自己定义的项目名称使用这个命令之后我,可以看到下面这个
这里提示我们选择哪一个来创建我们的项目,这里我建议使用pnpm
,因为pnpm相关的包更加小,速度更加快
选择完毕之后我们稍等片刻项目就构建好了
控制器🔑🔑
我们在初始完项目之后打开src会发现有以下几个文件:app.controller.ts
,app.module.ts
,app.service.ts
,其实在nestjs中这三个文件是最根本的文件,我们就通过这三个文件入手来讲解。
我们首先来讲解第一个文件所代表的含义:
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() getHello(): string { return this.appService.getHello(); } }
我们可以看到上面的这部分代码,大家目前应该会很懵,听我接下来的讲解:
- 首先这里面引用了
Controller, Get
这两个装饰器,其中第一个装饰器声明在类上面,表明这个类是一个控制器,我们可以把这个装饰器当成一个路由,这个装饰器@Controller
中可以接收参数,这个参数相当于是url,例如如果我们加上'api'
,这个参数,那么访问这个类中的所有方法都要加上这个前缀url - 其实这个控制器和我们上面讲解的依赖注入中的Container是一个用途,在这里面他做的工作就是分发请求,将不同的请求分发到不同的方法中,然后我们还导入了AppService,注意这里面导入的方式就是
依赖注入
. - 我们在这个类中使用了构造函数,并且里面还接受了一个值,这里就用到了我们上面讲解的
依赖注入
,我们这里的AppService
你既可以理解为TS中的类型,但是更重要的是这里是依赖注入的功能,简单来讲就是在AppController这个类中注册了一个属性方法,然后我们可以调用这个属性方法了,来访问这个文件中定义的方法,例如我在这个服务文件中定义了getWorld这个方法,那么这里就可以访问到 - 然后我们在控制器中声明了一个
getHello
方法,你可以理解为路由, 这个方法是用@Get
装饰器修饰的,表明能接收get请求,当然你如果看了我讲TS中的装饰器这篇文章,应该是很好理解的,这个装饰器和上面的装饰器类似,也可以接收一个参数,这个参数也相当于是url,当我们想要访问getHello这个路由的时候就需要加上这个url地址 - 我们在getHello中调用了上面注册的
appService
这个类中方法,我们需要知道这个服务中写的其实就是具体的逻辑处理,我们在Controller接收请求,根据地址分发到控制器中对应的路由中,然后在对应的路由调用对应服务中的方法来解决,所以这个就是控制器的作用,我们可以理解成一个快递中转站,经过这个中转站,快递就会被分配好发往全国。
服务🎃🎃
经过上面的介绍,大家应该对控制器是干什么的有了大致的了解了,那么接下来我们就来讲解服务
正如上面我们所讲的,服务其实就是具体的逻辑处理,
import { Injectable } from '@nestjs/common'; @Injectable() export class AppService { getHello(): string { return 'Hello World!'; } }
我们可以看到在服务这个类的上面我们使用了@Injectable
这个装饰器,来表明这个类是服务类。
我们初始化项目之后,点开最初的app.service文件就会有上面这段代码,这段代码逻辑很简单,就是返回了一串字符串
就像我们之前讲解的,服务的作用就是用来处理具体的逻辑问题,当控制器中的路由方法将请求接收之后,并且调用了服务的方法,那么此时服务就可以进行相应的工作了,例如操作数据库等逻辑处理。
模块🤠🤠
我们在初始化项目之后,打开app.module.ts
这个文件就会看到下面这段代码
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ imports: [], controllers: [AppController], providers: [AppService], }) export class AppModule {}
我们这里使用了@Module
这个装饰器,这个装饰器有什么用呢?
@Module()
装饰器提供了元数据
,Nest.js用它来组织应用程序结构
- 模块之间的依赖关系,决定了应用程序树的结构
首先我们会发现这个里面有一个controllers
这个属性,数据就是我们定义的控制器,
关键就是providers
这个属性,我们要在内部控制器中调用的服务,我们需要首先在这个providers
中导入,否则无法正常使用。
还有imports
这个这部分的作用就是导入其他模块,例如如果我们想要在当前模块中使用其他模块中的服务,那么我们需要首先在imports
中导入相应的模块
小结🤞🤞
我们这一节简单的讲解了nestjs的基础部分,可能会漏很多东西,我们在之后会逐渐补充完整,大家有什么疑问可以提出,我也是初学者,可能有些地方劣迹不到位,大家相互交流共同进步。