学习前需求掌握的常识:

  • 娴熟运用TypeScript以及TypeScript的各种装修器
  • 了解NodeJS以及了解一点MVC思维(了解的话本文能够引导一下你就愈加清晰了)

装修器学习文章:走近MidwayJS:初识TS装修器与IoC机制

Nest介绍

一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。Nest 构建在强大的 HTTP 服务器框架上,例如默许是 Express 并且还能够经过配置然后运用 Fastify !

优点:

  • TypeScript支撑良好
  • 根据MVC思维使得项目愈加规范
  • 提供ExpressFastify两个Node框架,假如了解其间一个那么就相对容易下手

装置Nest

装置Nest前需求保证你已经装置了Nodejs

npm i -g @nestjs/cli  // 大局装置Nest
nest new project-name  // 创立项目

初始化项目流程

  1. 选择你喜爱的包管理工具,你得提前装置喜爱的包管理工具。

NodeJS(一)基础篇

  1. 等候装置结束既进入项目可发动项目

NodeJS(一)基础篇

  1. cd进入目录后,能够在命令行输入code ./方便 翻开vscode编辑器

NodeJS(一)基础篇

目录结构介绍

NodeJS(一)基础篇

核心代码都在src文件下面。

src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
├── main.ts

给大家解释一下app.xxx.ts代表的含义

app.controller.spec.ts 操控器的测试文件
app.controller.ts 单一路由操控器(Controller)
app.module.ts 应用程序的根模块(Module)
app.service.ts 具有单一办法的根本服务(Service)
main.ts nestjs程序主进口

发动项目

  1. 我这儿运用的是pnpm发动,假如你没有装置能够运用npm run start:dev
// 这个能够实时更新代码(引荐运用这种办法)
pnpm start:dev
// 代码更新后需求重启服务器
pnpm start
  1. 发动项目或许遇到的问题:

NodeJS(一)基础篇

nest默许端口号是3000,假如你3000端口号被占用了那么你得在src/main.ts中换一个端口号,这儿我换成了8082

NodeJS(一)基础篇

  1. 翻开浏览器拜访项目地址:http://localhost:8082,这儿的8082端口能够改成你自己界说的端口号

NodeJS(一)基础篇

运行流程解说

1.程序进口

main.ts进入然后履行NestFactory.create创立一个AppModule实例,然后发动HTTP监听8082端口。

// src/main.ts
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
async function bootstrap() {
    const app = await NestFactory.create(AppModule)
    await app.listen(8082)
}
bootstrap()

2. 声明模块

// src/app.module.ts
import { Module } from '@nestjs/common'
import { AppController } from './app.controller'
import { AppService } from './app.service'
// 1. 运用 Module 作为类装修器
@Module({
    imports: [],
  	exports: [],
    controllers: [AppController], // 2.载入一个操控器
    providers: [AppService], // 3. 注入事务逻辑
})
export class AppModule {}

AppModule是程序的发动模块,运用了Module作为类装修器,@Module()接纳一个配置对象里边有四个特点:providerscontrollersimportsexports

providers 注入具体事务逻辑给Nest的各个模块
controllers 1. 操控路由
  1. 处理HTTP恳求
  2. 呼应数据给客户端
  3. 将事务托付给providers处理 | | imports | 在这儿导入其他模块的服务 | | exports | 在这儿同享当前模块服务出去 |

3.载入操控器

每个操控器都有GETPOSTPUTDELETE恳求办法,它们能够同时呈现,但不要重复呈现两次同样的恳求办法

// src/app.controller.ts
import { Controller, Get } from '@nestjs/common'
import { AppService } from './app.service'
// 1. @Controller() 界说一个操控器
@Controller()
export class AppController {
    constructor(private readonly appService: AppService) {}
    // 2. @Get 恳求办法润饰器
    @Get()
    getHello(): string {
        // 3. 直接调用 AppService 实例的办法
        return this.appService.getHello()
    }
}
  1. @Controller()接纳一个字符串作为参数,不传的话便是/下文独自列出解说。例如:@Controller('app')那么咱们的地址便是http://localhost:8082 /app才干拜访接口数据了,否则便是404
  1. @Get()的作用是润饰getHello办法,这样当操控器接纳到GET恳求后就会触发getHello办法 。相对应的还有@Post()@Put()@Delate()等恳求办法
  1. 咱们之所以能够直接调用this.appService.getHello()而不需求new AppService,还得持续往下看

4.注入逻辑给操控器调用

import { Injectable } from '@nestjs/common'
// 1.@Injectable()
@Injectable()
export class AppService {
    getHello(): string {
        return 'Hello World!'
    }
}

@Injectable()润饰后的AppService,在src/app.controller.ts运用时不需求再去new AppService

路由装修器@Controller

NestJS根据装修器润饰路由。修正一下app.controller.ts看看效果:

import { Controller, Get } from '@nestjs/common'
import { AppService } from './app.service'
// 1.传递一个 'hello' 给装修器 
@Controller('hello')
export class AppController {
    constructor(private readonly appService: AppService) {}
    @Get()
    getHello(): string {
        return this.appService.getHello()
    }
}

当咱们拜访http://localhost:8082,结果404

tips: 假如你还是能正常拜访,那么你得重启服务器或者命令行从头履行pnpm start:dev这样才干更新最新的代码哦

NodeJS(一)基础篇

需求经过http://localhost:8082/hello拜访:

NodeJS(一)基础篇

从上图能够看出来咱们代码的 @Controller('hello') 实际上便是给路由增加了拜访途径

HTTP办法装修器

除了操控器中能够增加途径,咱们的恳求办法装修器也是能够的。常见恳求办法装修器有:@Get()@Post()@Put@Delete

办法装修器是比较灵活的除了根本恳求的途径外还支撑通配符途径以及参数途径

tisp: 每一个操控器内只能存在一种类型的办法装修器

// 主途径为 hello
@Controller('hello')
export class AppController {
    constructor(private readonly appService: AppService) {}
    // 1. 固定途径:
    // 发送GET恳求,能够匹配到,http://localhost:8082/hello/get
    @Get('get')
    get(): string {
        // 事务逻辑...
        return ''
    }
    // 多层途径
    // 能够匹配到 GET 恳求,http://localhost:8082/hello/world/liang
    @Get('world/liang')
    liang(): string {
        // 事务逻辑...
        return ''
    }
    // 发送POST恳求,能够匹配到:http://localhost:8082/hello/post
    @Post('post')
    post(): string {
        // 事务逻辑...
        return ''
    }
    // 2.通配符途径(?+* 三种通配符 )
    // 能够匹配到 DELETE 恳求, http://localhost:8082/hello/del_xxx
    @Delete('del_*')
    del(): string {
        return 'get_*'
    }
    // 3.带参数途径
    // 能够匹配到 PUT 恳求,http://localhost:8082/hello/put/xxxx
    @Put('put/:id')
    Put() {
        return 'update put/:id'
    }
}

除了上面的恳求办法还有一种设置恳求途径的办法:大局前缀名

大局前缀途径

望文生义便是在悉数的恳求途径上增加一个途径

咱们能够在src/main.ts中设置大局的前缀途径

import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
async function bootstrap() {
    const app = await NestFactory.create(AppModule)
    // 1. 便是这么简略的一句话
    app.setGlobalPrefix('api')
    await app.listen(8082)
}
bootstrap()

这样咱们在发送恳求的时候就得http://localhost:8082 /api/xxx了,否则会呈现404的状况。


结束语

本章带大家简略入门一下NestJS后面会持续深化运用~