NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用的框架,基于 TypeScript 构建,并且受 Angular 的启发,提供了模块化、易测试、易维护的架构。NestJS 10.x 引入了一些新特性和改进,进一步提升了开发体验。本文将详细介绍如何使用 NestJS 10.x 构建一个基础应用,并涵盖常用功能和最佳实践。
1. 安装和初始化项目
安装 NestJS CLI
NestJS 提供了一个命令行工具(CLI),可以快速创建和管理项目。
npm install -g @nestjs/cli
创建新项目
使用 CLI 创建一个新的 NestJS 项目:
nest new project-name
根据提示选择包管理器(npm 或 yarn),CLI 会自动安装依赖并创建项目结构。
2. 项目结构
NestJS 项目具有模块化的结构,每个功能模块都包含控制器(Controllers)、提供者(Providers)和服务(Services)。
src/
├── app.controller.ts
├── app.controller.spec.ts
├── app.module.ts
├── app.service.ts
├── main.ts
- app.controller.ts:定义应用的控制器。控制器处理传入的HTTP请求并返回HTTP响应。
- app.service.ts:定义应用的服务。服务包含业务逻辑,并可以被控制器调用。
- app.module.ts:定义应用的模块。模块用于组织和管理控制器、服务等组成部分。
- main.ts:应用的入口文件。启动 NestJS 应用。
3. 创建模块、控制器和服务
创建模块
模块是组织代码的基本单元。使用 CLI 创建一个新模块:
nest generate module users
创建控制器
控制器负责处理传入的请求并返回响应。使用 CLI 创建一个新控制器:
nest generate controller users
创建服务
服务包含业务逻辑,通常通过依赖注入被控制器调用。使用 CLI 创建一个新服务:
nest generate service users
4. 控制器和服务的使用
定义控制器
控制器处理传入的请求并返回响应。
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
findAll(): string {
return this.usersService.findAll();
}
}
定义服务
服务包含业务逻辑,通常通过依赖注入被控制器调用。
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
findAll(): string {
return 'This action returns all users';
}
}
5. 使用中间件
中间件可以在请求处理管道中执行额外的操作,比如记录日志或验证请求。
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
}
}
在模块中应用中间件:
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { LoggerMiddleware } from './logger.middleware';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('users');
}
}
6. 使用管道(Pipes)
管道用于转换和验证请求数据。它们在请求到达控制器之前被调用。
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class ValidationPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
if (!value) {
throw new BadRequestException('Validation failed');
}
return value;
}
}
在控制器中使用管道:
import { Controller, Get, Query, UsePipes } from '@nestjs/common';
import { UsersService } from './users.service';
import { ValidationPipe } from './validation.pipe';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
@UsePipes(new ValidationPipe())
findAll(@Query('name') name: string): string {
return this.usersService.findAll();
}
}
7. 使用拦截器(Interceptors)
拦截器用于拦截和处理控制器方法的调用,常用于日志记录、错误处理和响应映射。
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
console.log('Before...');
const now = Date.now();
return next
.handle()
.pipe(
tap(() => console.log(`After... ${Date.now() - now}ms`)),
);
}
}
在控制器中使用拦截器:
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { UsersService } from './users.service';
import { LoggingInterceptor } from './logging.interceptor';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
@UseInterceptors(LoggingInterceptor)
findAll(): string {
return this.usersService.findAll();
}
}
结论
通过本教程,你可以快速上手 NestJS 10.x 并构建高效、可扩展的服务器端应用。NestJS 提供了丰富的功能和模块化架构,适合构建各种规模的应用。如果有任何问题或需要进一步的帮助,请在评论区留言或者联系我。