node中的Nest.js框架怎么用

发布时间:2022-02-07 09:26:52 作者:iii
来源:亿速云 阅读:239
# Node中的Nest.js框架怎么用

## 目录
1. [Nest.js简介](#nestjs简介)
2. [核心概念](#核心概念)
3. [环境搭建](#环境搭建)
4. [项目结构](#项目结构)
5. [控制器(Controllers)](#控制器controllers)
6. [提供者(Providers)](#提供者providers)
7. [模块(Modules)](#模块modules)
8. [中间件(Middleware)](#中间件middleware)
9. [异常过滤器(Exception Filters)](#异常过滤器exception-filters)
10. [管道(Pipes)](#管道pipes)
11. [守卫(Guards)](#守卫guards)
12. [拦截器(Interceptors)](#拦截器interceptors)
13. [数据库集成](#数据库集成)
14. [认证与授权](#认证与授权)
15. [部署与优化](#部署与优化)
16. [最佳实践](#最佳实践)
17. [常见问题](#常见问题)

<a id="nestjs简介"></a>
## 1. Nest.js简介

Nest.js是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript,结合了OOP(面向对象编程)、FP(函数式编程)和FRP(函数式响应编程)的元素。

### 核心特性
- **模块化架构**:基于Angular风格的模块系统
- **依赖注入**:强大的DI容器
- **多传输层支持**:HTTP、WebSocket、gRPC等
- **丰富的生态系统**:与TypeORM、Mongoose、GraphQL等无缝集成
- **企业级框架**:适合构建大型复杂应用

<a id="核心概念"></a>
## 2. 核心概念

### 2.1 模块化设计
Nest.js采用模块化设计,每个应用至少有一个根模块(通常命名为`AppModule`)

### 2.2 依赖注入
Nest.js的核心设计模式,通过`@Injectable()`装饰器声明可注入类

### 2.3 装饰器
大量使用ES7装饰器语法来声明元数据

```typescript
@Controller('users')
export class UsersController {
  @Get()
  findAll(): string {
    return 'All users';
  }
}

3. 环境搭建

3.1 系统要求

3.2 安装Nest CLI

npm install -g @nestjs/cli

3.3 创建新项目

nest new project-name

3.4 项目结构概览

src/
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts

4. 项目结构

4.1 推荐结构

src/
├── common/               # 共享模块
├── config/               # 配置文件
├── modules/              # 业务模块
│   ├── users/
│   │   ├── users.controller.ts
│   │   ├── users.module.ts
│   │   └── users.service.ts
├── main.ts               # 入口文件
└── app.module.ts         # 根模块

4.2 功能模块组织

建议按功能而非技术角色组织代码

5. 控制器(Controllers)

5.1 创建控制器

nest generate controller users

5.2 基本控制器示例

import { Controller, Get, Post } from '@nestjs/common';

@Controller('users')
export class UsersController {
  @Get()
  findAll(): string {
    return 'All users';
  }

  @Post()
  create(): string {
    return 'User created';
  }
}

5.3 路由参数

@Get(':id')
findOne(@Param('id') id: string): string {
  return `User ${id}`;
}

6. 提供者(Providers)

6.1 服务示例

import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  private readonly users = [];

  create(user) {
    this.users.push(user);
    return user;
  }

  findAll() {
    return this.users;
  }
}

6.2 依赖注入

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}
}

7. 模块(Modules)

7.1 基本模块结构

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

7.2 模块导入

@Module({
  imports: [OtherModule],
})
export class AppModule {}

8. 中间件(Middleware)

8.1 创建中间件

import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    console.log('Request...');
    next();
  }
}

8.2 应用中间件

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes('*');
  }
}

9. 异常过滤器(Exception Filters)

9.1 自定义异常

export class ForbiddenException extends HttpException {
  constructor() {
    super('Forbidden', HttpStatus.FORBIDDEN);
  }
}

9.2 异常过滤器

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();
    const status = exception.getStatus();

    response.status(status).json({
      statusCode: status,
      timestamp: new Date().toISOString(),
      path: request.url,
    });
  }
}

10. 管道(Pipes)

10.1 内置管道

@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
  return this.usersService.findOne(id);
}

10.2 自定义管道

@Injectable()
export class ValidationPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    // 验证逻辑
    return value;
  }
}

11. 守卫(Guards)

11.1 认证守卫

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    return validateRequest(request);
  }
}

11.2 使用守卫

@UseGuards(AuthGuard)
@Controller('users')
export class UsersController {}

12. 拦截器(Interceptors)

12.1 日志拦截器

@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`)));
  }
}

12.2 响应映射

@Injectable()
export class TransformInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(map(data => ({ data })));
  }
}

13. 数据库集成

13.1 TypeORM集成

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'password',
      database: 'test',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

13.2 实体定义

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;
}

14. 认证与授权

14.1 JWT认证

@Module({
  imports: [
    JwtModule.register({
      secret: 'secretKey',
      signOptions: { expiresIn: '60s' },
    }),
  ],
})
export class AuthModule {}

14.2 策略实现

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: 'secretKey',
    });
  }

  async validate(payload: any) {
    return { userId: payload.sub, username: payload.username };
  }
}

15. 部署与优化

15.1 生产环境配置

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableShutdownHooks();
  await app.listen(3000);
}

15.2 性能优化

16. 最佳实践

16.1 项目组织

16.2 测试策略

17. 常见问题

17.1 循环依赖

解决方案: - 使用前向引用(forwardRef) - 重构代码结构

17.2 性能瓶颈

17.3 调试技巧


本文详细介绍了Nest.js框架的核心概念和使用方法,从基础搭建到高级功能实现,涵盖了开发企业级Node.js应用所需的全部知识。通过模块化设计、依赖注入和丰富的装饰器,Nest.js为构建可维护、可扩展的后端应用提供了强大支持。 “`

注:由于篇幅限制,这里提供的是文章的结构框架和核心内容示例。实际7100字的完整文章需要扩展每个章节的详细内容,包括更多代码示例、配置细节、最佳实践分析和实际案例说明。您可以根据这个框架进一步扩充具体内容。

推荐阅读:
  1. Node框架如何接入ELK
  2. node.js之koa框架怎么用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

node nest.js

上一篇:swoole安装的方法

下一篇:怎么用HeheCloud快速部署Wordpress应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》