学习前需求掌握的常识:
- 娴熟运用
TypeScript
以及TypeScript
的各种装修器 - 了解
NodeJS
以及了解一点MVC
思维(了解的话本文能够引导一下你就愈加清晰了)
装修器学习文章:走近MidwayJS:初识TS装修器与IoC机制
Nest
介绍
一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。Nest 构建在强大的 HTTP 服务器框架上,例如默许是 Express 并且还能够经过配置然后运用 Fastify !
优点:
- 对
TypeScript
支撑良好 - 根据
MVC
思维使得项目愈加规范 - 提供
Express
和Fastify
两个Node
框架,假如了解其间一个那么就相对容易下手
装置Nest
装置Nest
前需求保证你已经装置了Nodejs
。
npm i -g @nestjs/cli // 大局装置Nest
nest new project-name // 创立项目
初始化项目流程
- 选择你喜爱的包管理工具,你得提前装置喜爱的包管理工具。
- 等候装置结束既进入项目可发动项目
-
cd
进入目录后,能够在命令行输入code ./
方便 翻开vscode
编辑器
目录结构介绍
核心代码都在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 程序主进口 |
发动项目
- 我这儿运用的是
pnpm
发动,假如你没有装置能够运用npm run start:dev
。
// 这个能够实时更新代码(引荐运用这种办法)
pnpm start:dev
// 代码更新后需求重启服务器
pnpm start
- 发动项目或许遇到的问题:
nest
默许端口号是3000
,假如你3000
端口号被占用了那么你得在src/main.ts
中换一个端口号,这儿我换成了8082
- 翻开浏览器拜访项目地址:
http://localhost:8082
,这儿的8082
端口能够改成你自己界说的端口号
运行流程解说
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()
接纳一个配置对象里边有四个特点:providers
、controllers
、imports
、exports
。
providers |
注入具体事务逻辑给Nest 的各个模块 |
---|---|
controllers |
1. 操控路由 |
- 处理
HTTP
恳求 - 呼应数据给客户端
- 将事务托付给
providers
处理 | |imports
| 在这儿导入其他模块的服务 | |exports
| 在这儿同享当前模块服务出去 |
3.载入操控器
每个操控器都有GET
、POST
、PUT
、DELETE
恳求办法,它们能够同时呈现,但不要重复呈现两次同样的恳求办法
// 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()
}
}
-
@Controller()
接纳一个字符串作为参数,不传的话便是/
,下文独自列出解说。例如:@Controller('app')
那么咱们的地址便是http://localhost:8082 /app
才干拜访接口数据了,否则便是404
-
@Get()
的作用是润饰getHello
办法,这样当操控器接纳到GET
恳求后就会触发getHello
办法 。相对应的还有@Post()
、@Put()
、@Delate()
等恳求办法
- 咱们之所以能够直接调用
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
这样才干更新最新的代码哦
需求经过http://localhost:8082/hello
拜访:
从上图能够看出来咱们代码的 @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
后面会持续深化运用~