服务器端的笔记
1. NestJS框架学习
1. 项目准备
安装nestjs框架: npm install @nestjs/cli -g
创建项目, 创建一个名为hzh-nest的项目: nest new hzh-nest
测试启动项目: npm run start
运行在本地的3000端口上
代码托管: 在GitHub上创建hzh-nest仓库
将本地的代码发到GitHub上
1. 添加.gitignore文件, 防止将过多的不必要的文件发送到服务器端: https://github.com/nestjs/typescript-starter/blob/master/.gitignore
2. 本地使用命令, 将代码发送到远程的master分支:
2.1. git add .
2.2. git commit -m "首次提交"
2.3. git remote add origin https://github.com/huangzhehao97/hzh-nestjs.git
2.4. git push -u origin master
3. 创建preview分支, 并将代码推送到preview方便后续的代码管理:
3.1. git checkout -b preview
3.2. git push origin preview
2. 开始学习NestJS的内容
2.1. 模块, 控制器, 服务
app.controller.ts: 控制器用来响应用户的请求
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
// 控制器装饰器
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
// Get装饰器
// 定义了一个get请求要执行的操作
@Get()
getHello(): string {
// 调用appService定义的getHello()方法
// Get请求"/"的反馈
return this.appService.getHello();
}
}
app.service.ts: 服务,控制器对不同的请求在服务中找不同的服务, 对请求进行反馈
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
// 返回字符串类型
getHello(): string {
return 'Hello World!';
}
}
使用npm run start:dev 就可以自动检测代码是否改动, 并重新启动项目
2.2. 创建一个新的控制器
使用命令: nest generate controller demo
会在src目录下创建一个demo目录里面一个是测试的文件: demo.controller.spec.ts, 另一个是控制器文件: demo.controller.ts.
同时在原来的Module文件中注册了新创建的控制器文件
在控制器文件中加入两个Get()请求的装饰器, 一个不带参数, 一个带参数, 用来响应“localhost/demo”
控制器代码
import { Controller, Get, Param } from '@nestjs/common';
@Controller('demo')
export class DemoController {
@Get()
gohstStory(){
return '🐶🐷🐂';
}
@Get(':id') // 参数, 命名为id
show(@Param('id') id) { // 在装饰器中Param中设置参数为id
// 返回字符串
return `id : ${ id }`;
}
}
提交代码:
1. git add .
2. git commit -m "自己创建了一个controller, 响应了带参数的Get请求的"
3. git push origin preview
2.3. 创建一个新的Service
使用命令: nest generate service demo # 自动放在demo目录下面
demo.service.spec.ts是测试文件; demo.service.ts 是Service文件; 要在app.module.ts 中注册服务
将在控制器中的代码迁移到DemoService中
import { Injectable } from '@nestjs/common';
@Injectable()
export class DemoService {
// 从服务器中
gohstStory(){
return '🐶🐷🐂';
}
}
在Controller中使用Service中定义的函数
引入Service类, 创建构造方法, 注意该构造方法是私有, 只读的, 创建了一个Service类型的对象, 之后通过这个对象调用对应的服务的函数
import { Controller, Get, Param } from '@nestjs/common';
import {DemoService} from './demo.service'
@Controller('demo')
export class DemoController {
// 引入DemoService
// constructor -- 构造方法, 代码自动会被调用
// private -- 私有的, 里面的方法之后这个类才能使用
// readonly -- 只读的, 变量的值一但被设定好了, 就不能再发生改变
// demoService -- 对象类型为DemoService
constructor(private readonly demoService: DemoService){}
@Get()
gohstStory(){
// 返回服务中的gohstStory方法
return this.demoService.gohstStory();
}
@Get(':id') // 参数, 命名为id
show(@Param('id') id) { // 在装饰器中Param中设置参数为id
// 返回字符串
return `id : ${ id }`;
}
}
上传代码:
1. git add .
2. git commit -m "创建Service并在Controller中使用"
3. git push origin prewiew
2.4 创建Module
使用命令创建一个Module: nest generate module demo
将原来的Controller和Service注册到demo.module.ts中, 然后将demo.module.ts导入到app.module.ts中, app.module.ts是整个项目整体的module
import { Module } from '@nestjs/common';
import { DemoController } from './demo.controller'
import { DemoService } from './demo.service'
@Module({
controllers: [DemoController],
providers: [DemoService],
})
export class DemoModule { }
将demo.module.ts导入app.module.ts中
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DemoModule } from './demo/demo.module';
@Module({
imports: [DemoModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
代码推送到github:
1. git add .
2. git commit -m "module"
3. git push origin preview
2.5 中间件Middleware技术
中间件: 通俗的将就是在路由处理之前对request和response进行加工处理的一种技术
使用命令添加中间件, 在demo目录下创建demo中间件: nest generate middleware demo demo
在demo.middleware.ts文件中添加测试代码
其中req表示请求, res表示返回, next()表示下一个要调用的中间件
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class DemoMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
console.log('测试middleware -- 🐂'); // 测试的代码, 没有对request和response进行处理
next();
}
}
在demo的module中进行注册middleware
必须引入MiddlewareConsumer模块用来使用中间件, consumer的apple方法用来调用中间件, forRoutes方法用来规定使用apple设定的中间的路由或者控制器
forRoutes接受一个字符串表示中间件接受的路由或者接受一个控制器, 使得中间件对整个控制器的所有的路由都起作用.
import { Module, MiddlewareConsumer } from '@nestjs/common';
import { DemoController } from './demo.controller'
import { DemoService } from './demo.service'
import { DemoMiddleware } from './demo.middleware'
@Module({
controllers: [DemoController],
providers: [DemoService],
})
export class DemoModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(DemoMiddleware)
.forRoutes('demo') // .forRoutes(DemoController)
}
}
2. 通过NestJS实现微服务
1. 项目准备
在github.com上拉取项目
1. https://github.com/ninghao/ninghao-nestjs-s2-starter
全局安装nestjs
1. npm install @nestjs/cli --global
2. 在项目的目录下创建一个服务nest1: nest generate app nest-1
3. 启动root应用: npm run start --watch