Nest 简单入门指南

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();
添加分组
相关推荐
kongxx11 天前
NestJS中使用Guard实现路由保护
nestjs
白雾茫茫丶12 天前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
nestjs·nest.js·发布订阅·event emitter
lph65821 个月前
比起上传资源更应该懂得如何资源回收
node.js·nestjs
gsls2008081 个月前
将nestjs项目迁移到阿里云函数
阿里云·云计算·nestjs·云函数
d3126975101 个月前
在Nestjs使用mysql和typeorm
mysql·express·nestjs·typeorm
剪刀石头布啊2 个月前
nestjs-版本控制
nestjs
潇洒哥gg2 个月前
重生之我在NestJS中使用jwt鉴权
前端·javascript·nestjs
huangkaihao2 个月前
【NestJS学习笔记】 之 自定义装饰器
前端·node.js·nestjs
鹿鹿鹿鹿isNotDefined2 个月前
Nest 源码解析:依赖注入是怎么实现的?
nestjs
剪刀石头布啊2 个月前
nestjs-自定义装饰器
nestjs