Nest.js
简介
中文官方文档 英文官方文档
Nest (NestJS)
是一个用于构建高效、可扩展的Node.js
服务器端应用程序的框架。它使用渐进式 JavaScript
,构建并完全支持TypeScript
(但仍然允许开发人员使用纯 JavaScript
进行编码)并结合了 OOP
(面向对象编程)、FP
(函数式编程)和 FRP
(函数式响应式编程)的元素。
使用nestjs
的开发体验就像是搭积木一样,每一块业务逻辑基本都是有模块(module
)来控制,包括其对应下的接口等,这样使得每一块业务都非常的清晰.
快速上手(安装和新建项目)
- 安装
- 新建项目
项目文件解析
+-- dist[目录] +-- node_modules[目录] +-- src[目录] | +-- app.controller.spec.ts | +-- app.controller.ts | +-- app.module.ts | +-- app.service.ts | +-- app.main.ts +-- test[目录] | +-- app.e2e-spec.ts | +-- jest-e2e.json +-- .eslintrc.js +-- .gitignore +-- .prettierrc +-- nest-cli.json +-- package-lock.json +-- package.json +-- README.md +-- tsconfig.build.json +-- tsconfig.json
|
+-- src[目录] | +-- app.controller.spec.ts | +-- app.controller.ts | +-- app.module.ts | +-- app.service.ts | +-- app.main.ts
|
简单刨析
Module
是用来对外暴露当前模块,以及该模块下需要用到的controller
和service
都需要在module
中引入并注册,最终在app.module
中集中引入。官方推荐使用命令行的形式生成一个module
nest g module module_name
nest g module module_name --no-spec
|
controller
nestjs
作为web
服务对外暴露请求接口路径,controller
就是用来处理这些请求路径的控制器,一个controller
对应一个模块模块下有多个具体接口。我们一般在controller
中编写接口但是不编写业务逻辑
nest g controller controller_name
nest g controller controller_name --no-spec
|
service
controller
中每个独立请求的具体处理逻辑,每个controller
在使用service
的时候需要在constructor
注入该service
。总的来讲就是我们在controller
中编写的接口而对应的业务逻辑就在这里编写,同样官方推荐使用命令行的形式创建service
nest g service service_name
nest g service service_name --no-spec
|
基本案例展示:
- 这里我使用
nestjs
搭建了一个小的服务器并对外提供几个接口,使用到的知识就是上面提到的module
,service
以及controller
等结合使用,以及一些装饰符可以帮助我们获取接口的请求数据,请求体,请求头数据等,实现get
,post
以及动态路由的操作!
boys
模块(boys
文件夹)
main.ts
(整个项目的入口文件)
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module';
async function bootstrap() { const app = await NestFactory.create(AppModule); app.setGlobalPrefix('api'); await app.listen(3000); } bootstrap();
|
boys.controller.ts
(路由以及接口的编写)
import { Controller, Get, Request, Post, Query, Body, Param, Headers, } from '@nestjs/common'; import { BoysService } from './boys.service';
@Controller('boys') export class BoysController { constructor(private BoysService: BoysService) {
} @Get() getBoys(): Object { return this.BoysService.getBoys(); }
@Post('postAdd') addPostBoys(@Request() req): Object { console.log('请求参数post:', req.body);
return { msg: 'Post-Success!', data: req.body }; }
@Get('getAdd') addGetBoys(@Query() query): Object { console.log('请求参数get:', query);
return { msg: 'Get-Success!', data: query }; }
@Get('Add/:id/:name') addBoys(@Param() param, @Headers() headers): Object { console.log('请求参数param:', param, headers); return { msg: 'GetParam-Success!', data: param, headers: headers }; } }
|
boys.module.ts
(整个模块的入口文件)
import { Module } from '@nestjs/common'; import { BoysController } from './boys.controller'; import { BoysService } from './boys.service';
@Module({ controllers: [BoysController], providers: [BoysService], }) export class BoysModule {}
|
boys.service.ts
(接口处理数据的业务逻辑)
import { Injectable } from '@nestjs/common';
@Injectable() export class BoysService { getBoys(): Object { return { code: 200, data: ['小明', '小张'], msg: '请求数据成功!', }; }
addBoys(): Object { return { code: 200, data: { id: 4, name: '马老师', age: 57, }, msg: '新增数据成功!', }; } }
|
本篇博客参考自技术胖
的博文,原文地址