学习记录之nestjs---基本认识
NestJS是什么
- NestJS是基于Node的服务端应用开发框架
- Express是默认首选的NestJS的底层WEB工具
- NestJS与Java Springboot WEB框架设计非常类似
NestJS的设计特点
- 面像对象 (OPP)、FP/FRP
- 大量利用装饰器,对程序功能进行注解 @get()
- 设计类似于Angular,控制器、服务、管道等模块化设置、依赖注入
- 装备了多种数据库操作与socket的通信功能
- 保留并强化了express中间件特性
- 全面支持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
- @nest/common -包含了常规的Nest的函数和类封装
- @nestjs/core- Nest的编译运行的核心库
- @nestjs/platform-express 底层HTTP框架的平台安装
- reflect-metadata-装饰器的封装与功能支持
- typescript-TS语法支持
- 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()
完整的工作流程
- 启动应用: 执行bootsrap()函数
- 创建实例: Nest Factory根据AppModule创建应用
- 路由注册:框架扫描AppModule中注册的控制器
- 路由绑定:将AppController的/hello路由注册到路由表
- 监听端口:启动HTTP服务器监听3000端口
- 处理请求:当访问http://localhost:3000/hello时:
执行AppController.getHello()
返回Hello Nestjs