Nest.js 简介
Nest.js 是一个用 TypeScript 构建高效、可扩展的服务器端应用程序的框架。它结合了 TypeScript 的优势和 Angular 的设计理念,提供了一种优雅而强大的开发体验。Nest.js 基于模块化的架构,拥有强大的依赖注入、模块化、和可测试性等特性,使得构建复杂的应用程序变得更加容易。
安装 Nest.js CLI
要开始使用 Nest.js,首先需要安装 Nest.js 的命令行工具(CLI)。可以通过以下命令进行安装:
bash
npm install -g @nestjs/cli
安装完成后,我们就可以使用 nest
命令来创建新的 Nest.js 项目了。
创建 Nest.js 项目
通过以下命令创建一个新的 Nest.js 项目:
arduino
nest new my-nest-project
这将在当前目录下创建一个名为 my-nest-project
的新项目,并自动初始化一些基本的文件和配置。
运行流程
NestFactory
: 是 Nest.js 提供的一个工厂函数,用于创建 Nest 应用程序的实例。create()
: 是用来创建应用程序实例的方法。AppModule
: 是应用程序的根模块,它是 Nest.js 应用程序的入口点。

查看app.module模块




- 首先我们访问会先加载 控制器 也就是appController
- 其次我们控制器中注入了AppService
- 所以当我们访问localhost:3000时会出现 Hello World!
创建控制器
Nest.js 使用控制器来处理传入的请求,并返回响应。让我们创建一个简单的控制器来处理
/hello
路径的 GET 请求。
首先,执行以下命令来创建一个控制器:
nest generate controller hello
这将在项目中创建一个名为 hello
的控制器,并在其对应的目录下生成相应的文件。
在 hello.controller.ts
文件中编写以下代码:
kotlin
import { Controller, Get } from '@nestjs/common';
@Controller('hello')
export class HelloController {
@Get()
getHello(): string {
return 'Hello Nest.js!';
}
}
创建模块
在 Nest.js 中,控制器需要属于一个模块。因此,让我们创建一个简单的模块,并将我们的控制器添加到其中。
执行以下命令来创建一个名为 hello
的模块:
arduino
nest generate module hello
然后,在 hello.module.ts
文件中添加 HelloController
:
python
typescriptCopy Code
import { Module } from '@nestjs/common';
import { HelloController } from './hello.controller';
@Module({
controllers: [HelloController],
})
export class HelloModule {}
启动应用程序
现在,我们已经创建了一个简单的 Nest.js 应用程序,让我们启动它并测试一下。
在命令行中执行以下命令:
arduino
npm run start:dev
这将启动开发服务器,并在默认端口(通常是 3000)上监听请求。
现在,打开浏览器并访问 http://localhost:3000/hello
,你将会看到返回的消息:"Hello Nest.js!"
管道(Pipes)
管道是 Nest.js 中用于数据转换和验证的重要工具。它允许我们在数据进入路由处理程序之前对其进行预处理,例如验证数据的有效性或者对数据进行转换。下面是一个简单的示例,演示了如何在 Nest.js 中使用管道进行参数验证:
typescript
// validation.pipe.ts
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class ValidationPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
if (!isValid(value)) {
throw new BadRequestException('Validation failed');
}
return value;
}
}
less
// cats.controller.ts
import { Controller, Post, Body, UsePipes } from '@nestjs/common';
import { ValidationPipe } from './validation.pipe';
@Controller('cats')
export class CatsController {
@Post()
@UsePipes(new ValidationPipe())
create(@Body() createCatDto: CreateCatDto) {
// 处理创建新猫的逻辑
}
}
在这个示例中,我们创建了一个管道 ValidationPipe
,并将其应用到了 create
方法的参数上。如果参数验证失败,将抛出一个 BadRequestException
异常。
中间件(Middleware)
中间件是 Nest.js 中用于在请求到达路由处理程序之前或之后执行一些逻辑的工具。它可以用于记录请求日志、处理跨域请求等。下面是一个简单的示例,演示了如何在 Nest.js 中使用中间件记录请求日志:
typescript
// logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: Function) {
console.log(`Request...`);
next();
}
}
typescript
// app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
@Module({})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
}
在这个示例中,我们创建了一个中间件 LoggerMiddleware
,并将其应用到了所有路由上。每当有请求到达时,中间件将记录请求日志。
守卫(Guards)
守卫是 Nest.js 中用于保护路由的工具。它可以用于进行权限验证、身份验证等操作。下面是一个简单的示例,演示了如何在 Nest.js 中使用守卫保护路由:
typescript
// auth.guard.ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
return validateRequest(request);
}
}
less
// cats.controller.ts
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';
@Controller('cats')
export class CatsController {
@Get()
@UseGuards(AuthGuard)
findAll() {
// 处理获取所有猫的逻辑
}
}
在这个示例中,我们创建了一个守卫 AuthGuard
,并将其应用到了 findAll
方法的路由上。守卫将验证请求,确保只有经过验证的用户可以访问这个路由。
通过管道、中间件和守卫,Nest.js 提供了一套强大的工具,帮助我们构建安全可靠的 Web 应用程序。
引入swagger接口文档
下载相关依赖
js
npm install @nestjs/swagger swagger-ui-express
在main中引入
js
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { DocumentBuilder,SwaggerModule } from '@nestjs/swagger';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const options = new DocumentBuilder().setTitle('文档标题').setDescription('描述,。。。').setVersion('1').build()
const document = SwaggerModule.createDocument(app,options)
SwaggerModule.setup('/api-docs',app,document)
await app.listen(3000);
}
bootstrap();
添加分组
