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();
添加分组
相关推荐
亮子AI4 天前
【NestJS】为什么return不返回客户端?
前端·javascript·git·nestjs
小p4 天前
nestjs学习2:利用typescript改写express服务
nestjs
Eric_见嘉10 天前
NestJS 🧑‍🍳 厨子必修课(九):API 文档 Swagger
前端·后端·nestjs
XiaoYu200218 天前
第3章 Nest.js拦截器
前端·ai编程·nestjs
XiaoYu200220 天前
第2章 Nest.js入门
前端·ai编程·nestjs
实习生小黄20 天前
NestJS 调试方案
后端·nestjs
当时只道寻常24 天前
NestJS 如何配置环境变量
nestjs
濮水大叔1 个月前
VonaJS是如何做到文件级别精确HMR(热更新)的?
typescript·node.js·nestjs
ovensi1 个月前
告别笨重的 ELK,拥抱轻量级 PLG:NestJS 日志监控实战指南
nestjs