学习记录之nestjs---基本认识

发布于:2025-06-10 ⋅ 阅读:(20) ⋅ 点赞:(0)

NestJS是什么

  1. NestJS是基于Node的服务端应用开发框架
  2. Express是默认首选的NestJS的底层WEB工具
  3. NestJS与Java Springboot WEB框架设计非常类似

NestJS的设计特点

  1. 面像对象 (OPP)、FP/FRP
  2. 大量利用装饰器,对程序功能进行注解 @get()
  3. 设计类似于Angular,控制器、服务、管道等模块化设置、依赖注入
  4. 装备了多种数据库操作与socket的通信功能
  5. 保留并强化了express中间件特性
  6. 全面支持Typescript编程

发布订阅模式

function EventEmitter(){
    this.callbacks = {};
    this.subscribe = function(eventType, callback){
        if(!this.callbacks[eventType]){
            this.callbacks[eventType] = []
        }
        this.callbacks[eventType].push(callback)
    }
    this.publish = function(eventType){
        if(!this.callbacks[eventType]){
            return
        }
        this.callbacks[eventType].forEach(cb => cb())
    }
}
const eventEmitter = new EventEmitter()
//订阅事件
eventEmitter.subscribe('click', () => console.log('click'))
//发布事件
eventEmitter.publish('click')

如何理解发布订阅模式:
把EventEmitter当成一个事件调度中
当你订阅(subscribe)一个事件时,你告诉调度中心:“当某某事件发生时,请调用我提供的函数”
当你发布(publish)一个事件时,调度中心就会找到所有订阅了这个事件的回调函数,并一次调用他们
发布订阅模式工作流程
在这里插入图片描述
发布者: 触发事件(publish)
订阅者: 监听事件(subscribe)
事件中心:管理事件与回调的映射关系(callbacks对象)

手动搭建NestJS框架与环境

要先npm init -y 初始化package.json

  1. @nest/common -包含了常规的Nest的函数和类封装
  2. @nestjs/core- Nest的编译运行的核心库
  3. @nestjs/platform-express 底层HTTP框架的平台安装
  4. reflect-metadata-装饰器的封装与功能支持
  5. typescript-TS语法支持
  6. rxjs-利用观察者模式处理nest的事件
    配置ts环境
    1.安装
    2.配置typescript:首先要生产tsconfig.json文件,通过执行命令tsc --init
    在这里插入图片描述
    报错解决方案:https://blog.csdn.net/qq_41499782/article/details/112368529
    tsconfig.json的配置
    1.module:commonjs
    2.target: es2017要支持装饰器
    3.experimentalDecorators: true
    4.emitDecoratorMetadata: true
    服务启动
    1.安装ts-node-dev,全局安装,然后监听main.ts文件,src文件夹要新建,修改package.json文件,修改启动命令为:“dev”:“ts-node-dev ./src/main.ts”
    2.package.json :
    “scripts”: {
    “dev”: “ts-node-dev ./src/main.ts”
    },
    NestJS对请求的处理步骤
    1.通过Pipe管道对请求的数据进行校验
    2.通过Guard验证请求的权限
    3.Controller 进入路由调用函数
    4.执行请求的业务逻辑 -service
    5.Repository 访问数据库进行操作
    NestJS框架设计
    1.Controller处理请求
    2.Service处理数据访问与业务逻辑
    3.Modules封装业务逻辑代码
    4.Pipes验证请求的数据
    5.Filters处理请求的异常
    6.Guards验证请求的权限
    7.Interceptors拦截请求,增加额外的请求与响应的拦截处理
    8.Respitories 处理与数据库之间的交互

手动搭建的过程

控制器:
首先定义一个AppController类,给这个类加上一个装饰器@Controller(),这个装饰器要从@nestjs/common导入,在AppController类里面定义一个函数getHello方法,返回字符串 ‘hello nestjs’
@Controller(): 装饰器,将AppController类标记为NestJS控制器,控制器负责处理传入的请求和返回的响应
@Get(‘/hello’): 这个装饰器将getHello方法标记为处理HTTP GET请求的路由处理程序,当客户端请求’/hello’路径的时候就会调用此方法
getHello方法:当被调用时,它返回字符串 'hello nestjs’这个字符串会被NestJS自动包装为HTTP响应体,状态码默认为200

@Controller()
class AppController{
    @Get('/hello')
    getHello(){
        return "Hello Nestjs"
    }
}

模块
@Module:这个装饰器用于定义一个模块,模块是NestJS中组织代码的基本单元,它可以将相关的控制器、服务等组合在一起
在@Module装饰器中,我们传递了一个对象,其’controllers’属性是一个数组,包含了属于这个模块的控制器这里只有AppController,模块还可以包含其他属性,如’providers’(提供者,如服务),‘imports’(导入其他模块)等

@Module({
    controllers: [AppController]
})
class AppModule{

}

启动应用

async function bootstrap(){
    // 创建应用
    const app = await NestFactory.create(AppModule)
    await app.listen(3000,()=>{
        console.log('server is running at http://localhost:3000')
    })

}
bootstrap()

bootstrap是一个异步函数,它是整个应用程序的入口点
NestFactory.create(AppModule):使用NestFactory创建一个Nest应用实例,根模块为AppModule
app.listen:启动HTTP服务器,监听3000端口,当服务器成功启动后,会执行回调函数,打印出运行信息

import { Controller, Get, Module } from "@nestjs/common"
import { NestFactory} from "@nestjs/core"
// 指定当前类为nest控制器
@Controller()
class AppController{
    @Get('/hello')
    getHello(){
        return "Hello Nestjs"
    }
}
@Module({
    controllers: [AppController]
})
class AppModule{

}
async function bootstrap(){
    // 创建应用
    const app = await NestFactory.create(AppModule)
    await app.listen(3000,()=>{
        console.log('server is running at http://localhost:3000')
    })

}
bootstrap()

完整的工作流程

  1. 启动应用: 执行bootsrap()函数
  2. 创建实例: Nest Factory根据AppModule创建应用
  3. 路由注册:框架扫描AppModule中注册的控制器
  4. 路由绑定:将AppController的/hello路由注册到路由表
  5. 监听端口:启动HTTP服务器监听3000端口
  6. 处理请求:当访问http://localhost:3000/hello时:
    执行AppController.getHello()
    返回Hello Nestjs

网站公告

今日签到

点亮在社区的每一天
去签到