nestjs的学习(一)

简介: nestjs的学习(一)

前言✌️✌️


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是我们自己定义的项目名称使用这个命令之后我,可以看到下面这个

image.png

这里提示我们选择哪一个来创建我们的项目,这里我建议使用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的基础部分,可能会漏很多东西,我们在之后会逐渐补充完整,大家有什么疑问可以提出,我也是初学者,可能有些地方劣迹不到位,大家相互交流共同进步。

相关文章
|
开发框架 JavaScript 前端开发
NestJS:基础掌握 从了解到使用(上)
NestJS:基础掌握 从了解到使用(上)
174 0
|
JSON 关系型数据库 MySQL
NestJS:基础掌握 从了解到使用(下)
NestJS:基础掌握 从了解到使用(下)
260 0
|
前端开发
小满nestjs(第十章 nestjs 提供者)
如果服务 之间有相互的依赖 或者逻辑处理 可以使用 useFactory
182 0
小满nestjs(第十章 nestjs 提供者)
|
中间件
小满nestjs(第十二章 nestjs 中间件)
中间件是在路由处理程序 之前 调用的函数。 中间件函数可以访问请求和响应对象
227 1
小满nestjs(第十二章 nestjs 中间件)
|
JavaScript 前端开发
[Nestjs] 使用ncc加快启动速度
通过使用 ncc 可以将 NestJS 应用程序打包成一个单独的可执行文件,这可以加快应用程序的启动速度。下面是使用 ncc 加快 NestJS 应用程序启动速度的步骤:
293 0
|
开发框架 JavaScript 前端开发
NestJS系列(1):初识 NestJS 和 Hello,world
本文介绍了使用 @nest/cli 脚手架快速创建和启动一个 Nest 应用,随后又对“Hello, World”示例代码做了分析,简单介绍了一些 TypeSscript 语法,比如装饰器,和一些 Nest 的概念。相信看到这里,大家基本上了解了 Nest 应用接收到用户请求后,走了哪些流程,完成了响应。
34192 1
|
JavaScript
小满nestjs(第五章 nestjs cli)
通过 NestFactory.create(AppModule) 创建一个app 就是类似于绑定一个根组件App.vue
172 0
小满nestjs(第五章 nestjs cli)
小满nestjs(第十一章 nestjs 模块)
每个 Nest 应用程序至少有一个模块,即根模块。根模块是 Nest 开始安排应用程序树的地方。事实上,根模块可能是应用程序中唯一的模块,特别是当应用程序很小时,但是对于大型程序来说这是没有意义的。在大多数情况下,您将拥有多个模块,每个模块都有一组紧密相关的功能
135 0
小满nestjs(第十一章 nestjs 模块)
|
开发框架 JSON JavaScript
小满nestjs(第一章 介绍nestjs)
Nestjs 是一个用于构建高效可扩展的一个基于Node js 服务端 应用程序开发框架并且完全支持typeScript 结合了 AOP 面向切面的编程方式
219 0
小满nestjs(第一章 介绍nestjs)
|
JavaScript API
小满nestjs(第十五章 nestjs 和 RxJs)
nterval 五百毫秒执行一次 pipe 就是管道的意思 管道里面也是可以去掉接口的支持处理异步数据 去处理数据 这儿展示 了 map 和 filter 跟数组的方法是一样的 最后 通过观察者 subscribe 接受回调
133 0
小满nestjs(第十五章 nestjs 和 RxJs)