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

相关文章
J3
|
存储 前端开发 JavaScript
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
J3
954 0
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
|
4月前
|
人工智能 前端开发 API
【cursor】前后端分离项目下的AI跨工程管理方案
针对前后端分离项目中AI编辑器难以跨工程协作的问题,提出通过统一文件夹管理方案,将前端与后端项目置于同一根目录下,利用AI编辑器打开根目录并结合@引用功能,实现对前后端代码的联合理解与开发,提升联调效率与代码生成准确性。
1173 0
|
7月前
|
存储 弹性计算 数据管理
阿里云对象存储OSS收费标准:存储费、流量价格及不同计费模式全解析
阿里云OSS收费标准涵盖存储、流量等费用,支持按量付费与资源包两种模式。标准存储按量0.09元/GB/月,包年500GB仅需118.99元,流量费按公网出方向计费,闲时0.25元/GB,忙时0.5元/GB,可购流量包更优惠。
2268 6
|
编解码 文字识别 语音技术
MiniCPM-o 2.6:流式全模态,端到端,多模态端侧大模型来了!
MiniCPM-o 2.6 是 MiniCPM-o 系列的最新、性能最佳模型。该模型基于 SigLip-400M、Whisper-medium-300M、ChatTTS-200M 和 Qwen2.5-7B 构建,共 8B 参数,通过端到端方式训练和推理。相比 MiniCPM-V 2.6,该模型在性能上有了显著提升,并支持了实时语音对话和多模态流式交互的新功能。
2085 70
|
JavaScript 前端开发
Element_文件上传&&多个文件上传
Element_文件上传&&多个文件上传
1357 0
|
机器学习/深度学习 并行计算 异构计算
面向高效能计算的深度学习框架优化策略
【8月更文第9天】随着深度学习在各个领域的广泛应用,对训练模型的速度和效率要求越来越高。为了满足这些需求,深度学习框架需要针对不同硬件平台进行优化。本文将探讨针对GPU、TPU等硬件平台的优化策略,重点关注数据传输效率、并行计算策略及内存管理等方面。
546 1
|
Java Maven
Maven国内镜像配置
Maven国内镜像配置
20982 1
|
人工智能 城市大脑 运维
阿里云官网政企业务频道上线!
阿里云官网政企业务频道上线!
562 0
|
自然语言处理 数据可视化 机器人
使用ChatGPT生成思维导图
使用ChatGPT生成思维导图
864 0