NestJs
介绍Nest
Nest(NestJS)是一个框架,用于构建高效,可扩展的Node.js服务器端应用程序。它使用渐进式JavaScript,使用TypeScript构建并完全支持TypeScript(但仍使开发人员能够使用纯JavaScript编码),并结合了OOP(面向对象编程),FP(函数式编程)和FRP(函数式响应式编程)的元素。
1 安装nest
首先对于Node.Js的本版要求是(版本 >= 12,v13 除外)
1-1.淘宝镜像
安装完成nodejs后,npm install package 比较慢的话,建议使用淘宝镜像来安装包比较快,所以请先安装淘宝镜像
注意:
旧的cnpm域名已经停止使用(2022.02.31)
http://npm.taobao.org新的Web 站点:https://npmmirror.com,Registry Endpoint:https://registry.npmmirror.com
npm install -g cnpm --registry=https://registry.npmmirror.com
1-2.安装nestJs脚手架nest/cli
注意:如果脚本策略被禁止了权限会安装不成功的,会报错。需要在powershell或者cmd中执行如下命令就可以把策略修改成想要的了
Set-ExecutionPolicy RemoteSigned
安装脚手架nest/cli
cnpm i -g @nestjs/cli
1-3.查看nest帮助以及版本号等信息
nest --help
nest --version
1-4.创建nestjs项目demo
nest new demo
// new 可以简写成 n(别名)
nest n demo
默认会生成如下
|-- app.controller.ts
|-- app.controller.spec.ts
|-- app.module.ts
|-- app.service.ts
|-- main.ts
文件名称 | 描述 |
---|---|
app.controller.ts | 具有单个路由的基本控制器。 |
app.controller.spec.ts | 控制器的单元测试。 |
app.module.ts | 应用程序的根模块。 |
app.service.ts | 使用单一方法的基本服务。 |
main.ts | 使用核心函数创建 Nest 应用程序实例的应用程序的入口文件。NestFactory |
1-5.启动应用程序
cd demo
npm run start
// 重启服务, 加上 dev 就能监听文件修改了
npm run start:dev
在浏览器中访问http://localhost:3000/
1-6 项目结构
Nest 有两种组织代码的模式:
- 标准模式
- monorepo模式
1-6-1 标准模式
可用于构建具有自己的依赖项和设置的单个以项目为中心的应用程序,并且不需要针对共享模块进行优化或优化复杂生成。这是默认模式。
1-6-2 monorepo模式
此模式将代码工件视为轻量级 monorepo 的一部分,可能更适合开发人员团队和/或多项目环境。它自动化了构建过程的某些部分,以便于创建和组合模块化组件,促进代码重用,使集成测试更容易,可以轻松共享项目范围的工件(如规则和其他配置策略),并且比 github 子模块等替代方案更易于使用。Monorepo 模式使用文件中表示的工作区的概念来协调 monorepo 组件之间的关系。
2 nest 命令
2-1.命令1
命令 | 别名 | 描述 |
---|---|---|
new | n | 搭建新的标准模式应用程序,其中包含运行所需的所有样板文件。 |
generate | g | 基于原理图生成和/或修改文件。 |
build | 将应用程序或工作区编译为输出文件夹。 | |
start | 编译并运行应用程序(或工作区中的默认项目). | |
add | 编译并运行应用程序(或工作区中的默认项目)。 | |
info | i | 显示有关已安装的嵌套包的信息和其他有用的系统信息。 |
2-2 命令2
名称 | 别名 | 描述 |
---|---|---|
application | application | 在单存储库中生成一个新应用程序(如果是标准结构,则转换为单存储库)。 |
class | cl | 生成一个新类 |
configuration | config | Generate a CLI configuration file |
controller | co | 生成控制器声明 |
decorator | d | 生成自定义修饰器 |
filter | f | 生成筛选器声明 |
gateway | ga | 生成网关声明 |
guard | gu | 生成保护声明 |
interceptor | itc | 生成侦听器声明 |
interface | itf | 生成接口 |
middleware | mi | 生成中间件声明 |
module | mo | 生成模块声明。 |
pipe | pi | 生成管道声明 |
provider | pr | 生成提供程序声明 |
resolver | r | 生成解析程序声明 |
service | s | 生成服务声明 |
library | lib | 在单存储库中生成一个新库(如果是标准结构,则转换为单存储库)。 |
sub-app | app | Generate a new application within a monorepo |
resource | res | 生成新的 CRUD 资源。 |
//创建user模块,也可以使用 mo 别名生成
nest g module user
nest g mo user
//创建user控制器,也可以使用 co 别名生成
nest g controller user
nest g co user
//创建user服务,也可以使用 s 别名生成
nest g service user
nest g s user
例如1:创建新的(标准模式)Nest 项目
nest new <name> [options]
nest n <name> [options]
例如2:嵌套生成
根据原理图生成和/或修改文件
nest generate <schematic> <name> [options]
nest g <schematic> <name> [options]
创建库
nest g library my-library
3 框架
3-1 nestJs默认可以和Express、Fastify这两款NodeJs框架无缝配合使用
- Express
- Fastify
Express官网
通过npm安装express框架
npm install express --save
创建项目流程
mkdir myapp cd myapp npm init npm install express
fastify官网
Fastify,快速并且低开销的 web 框架,专为 Node.js 平台量身打造
通过 NPM 安装 fastify:
npm install fastify
创建server.js文件
// Require the framework and instantiate it const fastify = require('fastify')({ logger: true }) // Declare a route fastify.get('/', async (request, reply) => { return { hello: 'world' } }) // Run the server! const start = async () => { try { await fastify.listen(3000) } catch (err) { fastify.log.error(err) process.exit(1) } } start() ~~~
启动服务
node server
使用npm安装 fastify-cli:
npm install --global fastify-cli
使用fastify-cli创建新项目
fastify generate myproject
3-2 框架类型:
- NestExpressApplication
- NestFastifyApplication
指定使用哪个框架类型
注意:
除非你实际想要访问框架底层平台 API,否则无需指定类型
const app = await NestFactory.create<NestExpressApplication>(AppModule);
4 接口
OpenAPI 规范是一种与语言无关的定义格式,用于描述 RESTful API。Nest提供了一个专用模块,允许通过利用装饰器生成这样的规范。
4-1 安装依赖@nestjs/swagger
npm install --save @nestjs/swagger
使用类初始化 Swagger:main.tsSwaggerModule
import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const config = new DocumentBuilder()
.setTitle('Cats example')
.setDescription('The cats API description')
.setVersion('1.0')
.addTag('cats')
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);
await app.listen(3000);
}
bootstrap();
要考虑这些参数
- SwaggerModule
- @Body()
- @Query()
- @Param()