服务器端的笔记

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
posted @ 2020-05-14 13:59  HHZZHH  阅读(153)  评论(0编辑  收藏  举报