likes
comments
collection
share

nestjs的学习(一)

作者站长头像
站长
· 阅读数 13

前言✌️✌️

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注册类,然后再其他的类中就可以使用这个注册的类的方法。

装饰器

初始化✒️✒️

在学习之前我们要先进行初始化的工作

我们使用nestcli创建项目会非常简单,那么首先我们先来下载相关的包

 npm i -g @nestjs/cli

然后我们就可以初始化项目了

 nest new project-name

这里的project-name是我们自己定义的项目名称使用这个命令之后我,可以看到下面这个

nestjs的学习(一)

这里提示我们选择哪一个来创建我们的项目,这里我建议使用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中可以接收参数,这样访问相关接口的时候就要加上前缀(也就是传的参数),例如如果我们加上'api',这个参数,那么访问这个类中的所有方法都要加上这个前缀,其实这个控制器和我们上面讲解的依赖注入中的Container是一个用途,然后我们还导入了AppService,这个是服务文件等一下我们会细讲
  • 我们在这个类中使用了构造函数,并且里面还接受了一个值,这里就用到了我们上面讲解的依赖注入我们这里的AppService你既可以理解为TS中的类型,但是更重要的是这里是依赖注入的功能,简单来讲就是在AppController这个类中注册了一个属性方法,然后我们可以调用这个属性方法了
  • 然后我们在这个类中还声明了一个getHello方法,这个方法是用@Get装饰器修饰的,表明是一个get请求,当然你如果看了我讲TS中的装饰器这篇文章,应该是很好理解的,这个装饰器中可以接收参数,例如'hello',然后访问这个方法时候就需要加上这个。
  • 我们在这个方法中调用了上面注册的appService这个类中方法,我们需要知道这个服务中写的其实就是具体的逻辑处理,在Controller接收请求,然后分发到服务中,调用对应服务中的方法来解决,所以这个就是控制器的作用,我们可以理解成一个快递中转站,经过这个中转站,快递就会被分配好发往全国。

服务🎃🎃

经过上面的介绍,大家应该对控制器是干什么的有了大致的了解了,那么接下来我们就来讲解服务

正如上面我们所讲的,服务其实就是具体的逻辑处理,

import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

我们初始化项目之后,点开最初的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这个属性,我们要在控制器中调用的服务,除了依赖注入以外,我们需要在模块中的provide这个部分注册,否则无法正常使用,因为之后我们可能还会使用其他模块的服务,或者是nestjs中自带的服务,这个就涉及创建模块,创建服务等的功能了,这个我们之后再讲解。

还有import这个,这部分当我们创建其他模块的时候,如果我们要使用这个模块中的服务,那么我们也需要在import中导入这个模块,

小结🤞🤞

我们这一节简单的讲解了nestjs的基础部分,可能会漏很多东西,我在之后会逐渐补充完整,大家有什么疑问可以提出,笔者也是初学者,可能有些地方理解不到位,大家相互交流共同进步。