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