-
Nest
是一个渐进式的Node框架,可以在TypeScript
和JavaScript(ES6、ES7、ES8)
之上构建高效、可伸缩的企业级服务端应用程序;
-
Nest
基于TypeScritp
编写、并结合使用OOP(面向对象编程)
、FP(函数式编程)
和ERP(函数式响应编程)
的相关理念;
-
Nest
的设计灵感很多来自于Angular
,而Angular
的很多模式又来自于Java
的Spring
框架,诸如AOP(面向切片编程)、依赖注入、控制反转
等等,所以Nest
是Node
版的Spring
框架!
-
Nest
底层HTTP
平台默认基于Express
实现的,所以无需担心第三方库的缺失;技术上讲,Nest
可以在创建适配器后使用任何Node Http
框架,但它提供了两个开箱即用的HTTP
平台:Express、Fastify
;
-
Nest
的核心思想:提供一个层与层之间的耦合度极小、抽象化极高的架构体系。
环境搭建
- 脚手架:
npm i -g @nestjs/cli yarn global add @nestjs/di
- 创建项目:
nest new project-name
- 运行项目:
npm run start
- 热重载运行:
npm run start:dev
nest结构.png
控制器
- 控制器层负责处理用户的请求,并做出响应;
Client ---> Controller-1、Controller-2、Controller-3
- 创建控制器:
nest g controller xxx
- 在
src
目录中生成xxx
目录,其中包含xxx.controller.ts
- 控制器是一个装饰了
Controller
的类,xxx
生成对应的@Controller('xxx')
- 同时在根模块
app.module.ts
中,引入了此控制器:controllers:[AppController, XxxController]
-
@Get
装饰器处理Get
请求
@Controller('xxx')
export class XxxController {
@Get() // http://localhost:3000/xxx
index() {
return 'hello xxx'
}
@Get('add') // http://localhost:3000/xxx/add
add() {
return 'hello xxx add'
}
}
- 处理
Get
传参:@Query
@Get('add') // http://localhost:3000/xxx/add?id=123&name=Jack
add(@Query() query) { // { id: 123, name: Jack }
return 'hello xxx add'
}
@Get('add')
add(@Query('id') id) { // 指定只获取某一个参数
return id // 123
}
-
@Request
也可以处理Get参数,类似于Express
平台的Request
,包含有请求的完整信息。
@Get('add') // http://localhost:3000/xxx/add?id=123&name=Jack
add(@Request() req) {
return req.query // { id: 123, name: Jack }
}
-
@Post
装饰器处理Post
请求
@Post('create')
create() {
return 'hello xxx create'
}
-
@Body
处理Post参数
@Post('create')
create(@Body() body) {
return 'hello xxx create'
}
-
@Body
也可以指定只获取某一个参数:@Body('key')
-
@Param
处理动态路由的参数
@Get(':id') // http://localhost:3000/xxx/111
show(@Param() param) {
console.log(param) // { id: 111 }
return 'hello xxx'
}
@Get(':id')
show(@Param('id') id) { // 指定只获取 id
return id // 111
}
- 模糊匹配,如
*
表示匹配 n(n>=0)
个字符
@Get('a*a') // http://localhost:3000/xxx/adda
add() {
return 'hello xxx add'
}
-
@Headers(name?: string)
:获取请求头;@Redirect
:重定向;
-
@Response()
:响应对象的装饰器。控制器方法不能再通过 return
响应数据,而是使用 Response
对象自身的方法。
@Get()
admin(@Response() res) {
res.redirect('/user'); //重定向
}
@Get('add')
add(@Response() res) {
res.send({ msg: 'success' }); //响应数据
}
配置静态资源
- 静态资源配置依赖所使用的平台,以
Express
平台为例
-
main.ts
import { NestExpressApplication } from '@nestjs/platform-express';
async function bootstrap() {
// 通过泛型指定使用的平台Express
const app = await NestFactory.create<NestExpressApplication>(AppModule);
//配置静态资源的目录:根目录/public
app.useStaticAssets('public');
await app.listen(3000);
}
-
public
目录中的静态资源可以直接访问:http://localhost:3000/logo.png
- 还可以配置虚拟目录
app.useStaticAssets('public', { prefix: '/static/' });
//访问:http://localhost:3000/static/logo.png
配置模板引擎
- 以
ejs
为例:npm i ejs --save
-
main.ts
:配置视图文件的目录,指定使用的模板引擎;
app.setBaseViewsDir('views'); // 根目录/views
app.setViewEngine('ejs');
- 创建视图
views/admin/index.ejs
<h2>姓名:<%= name%></h2>
<h2>年龄:<%= age%></h2>
- 在控制器中渲染并响应视图
@Get()
@Render('admin/index')
admin() {
return { name: 'Mack', age: 20 } //向模板中传递数据
}
服务
-
Nestjs
中的服务可以是service
,也可以是provider
,可以通过constructor
注入依赖关系;
- 服务本质上就是通过
@Injectable()
装饰的类,在Nestjs
中,服务相当于MVC的Model
;
- 创建服务
nest g service xxx
- 生成
xxx/xxx.service.ts
import {Injectable} from '@nestjs/common'
@Injectable()
export class XxxService {
find() {
return {name: 'Jack', age: 20};
}
}
- 根模块
app.module.ts
中,自动引入服务
providers: [AppService, XxxService]
- 在需要使用的地方注入服务对象
nest g controller xxx //创建控制器
@Controller('xxx')
export class XxxController {
//依赖注入
constructor(private service: XxxService) { }
@Get()
index() {
return this.service.find();
}
}
网友评论