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: '新增数据成功!', }; } }
|
本篇博客参考自技术胖的博文,原文地址