如何使用Nest.js构建企业级后端服务

技术解码器 2019-09-05T14:51:29+08:00
0 0 251

Nest.js

Nest.js 是一个用于构建高效且可扩展的企业级 Node.js 后端应用程序的框架。它基于 TypeScript 开发,并且使用了面向对象和函数式编程的最佳实践。Nest.js 提供了一系列的功能和工具,帮助开发者更容易构建可维护和可测试的应用程序。

本博客将引导您如何使用 Nest.js 构建企业级后端服务。我们将讨论以下几个主题:

  • 安装和创建 Nest.js 项目
  • 创建控制器和服务
  • 通过依赖注入管理服务之间的关系
  • 使用中间件处理请求
  • 进行身份验证和授权
  • 使用数据访问对象 (DAO) 访问数据库
  • 编写单元测试和集成测试

安装和创建 Nest.js 项目

首先,确保您已经安装了 Node.js 和 npm。然后,通过以下命令全局安装 Nest.js CLI:

npm install -g @nestjs/cli

安装完成后,使用以下命令创建新的 Nest.js 项目:

nest new project-name

这将在当前目录下创建一个名为 project-name 的新项目。

创建控制器和服务

Nest.js 使用控制器来处理 HTTP 请求,服务来封装业务逻辑。使用 Nest.js CLI 可以轻松生成控制器和服务的模板。例如,创建一个名为 users 的用户控制器:

nest generate controller users

这将在 src/users 目录下生成一个 users.controller.ts 文件,包含一个基本的控制器模板。

创建一个名为 users 的用户服务:

nest generate service users

这将在 src/users 目录下生成一个 users.service.ts 文件,包含一个基本的服务模板。

通过依赖注入管理服务之间的关系

Nest.js 使用依赖注入 (DI) 来管理服务之间的关系。通过将服务注入到控制器或其他服务中,可以方便地共享和使用它们。

首先,在用户控制器中注入用户服务:

import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';

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

  @Get()
  getUsers() {
    return this.usersService.getUsers();
  }
}

然后,在用户服务中处理用户数据:

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

@Injectable()
export class UsersService {
  private readonly users = [
    { id: 1, name: 'John Doe' },
    { id: 2, name: 'Jane Smith' },
  ];

  getUsers() {
    return this.users;
  }
}

在上面的示例中,用户服务被注入到用户控制器中,并在 getUsers 方法中使用。

使用中间件处理请求

Nest.js 允许使用中间件来处理请求。中间件是一种在控制器之前或之后执行的功能。通过中间件,可以在请求到达控制器之前进行身份验证、记录请求日志等操作。

创建一个名为 logging.middleware.ts 的日志记录中间件:

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggingMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('Incoming request:', req.method, req.url);
    next();
  }
}

然后,在根模块中将中间件注册为全局中间件:

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggingMiddleware } from './logging.middleware';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggingMiddleware).forRoutes('*');
  }
}

在上面的示例中,我们将 LoggingMiddleware 注册为全局中间件,并应用于所有路由。

进行身份验证和授权

Nest.js 提供了一系列的工具和库来处理身份验证和授权。例如,您可以使用 passport 来管理认证策略,如 LocalStrategyJwtStrategy。通过使用这些策略,您可以对用户进行身份验证,并限制用户对受保护资源的访问。

在此处详细介绍身份验证和授权超出了本博客的范围,但您可以在 Nest.js 的官方文档中找到更多信息和示例。

使用数据访问对象 (DAO) 访问数据库

Nest.js 不限制您使用的数据库类型。您可以选择使用任何您喜欢的关系型数据库(如 PostgreSQL、MySQL)或非关系型数据库(如 MongoDB、Redis)。

为了方便地访问数据库,一种常见的做法是使用数据访问对象 (DAO)。DAO 是封装数据库操作的对象,使我们可以更好地组织和管理数据访问逻辑。

以下是一个使用 TypeORMusers 表格的简单示例:

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

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

  @Column()
  name: string;
}
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: Repository<User>,
  ) {}

  getUsers(): Promise<User[]> {
    return this.userRepository.find();
  }
}

在上面的示例中,我们使用 TypeORM 定义了 User 实体,并通过 userRepository 对象进行用户数据访问。

编写单元测试和集成测试

Nest.js 提供了一套强大的测试工具,帮助您编写单元测试和集成测试来确保应用程序的质量和可靠性。

例如,我们可以使用 Jest 来编写测试用例:

import { Test, TestingModule } from '@nestjs/testing';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { User } from './user.entity';
import { getRepositoryToken } from '@nestjs/typeorm';

describe('UsersController', () => {
  let usersController: UsersController;
  let usersService: UsersService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [UsersController],
      providers: [
        UsersService,
        {
          provide: getRepositoryToken(User),
          useClass: MockUserRepository,
        },
      ],
    }).compile();

    usersController = module.get<UsersController>(UsersController);
    usersService = module.get<UsersService>(UsersService);
  });

  describe('getUsers', () => {
    it('should return an array of users', () => {
      const users: User[] = [{ id: 1, name: 'John Doe' }];
      jest.spyOn(usersService, 'getUsers').mockImplementation(() => Promise.resolve(users));

      expect(usersController.getUsers()).toEqual(users);
    });
  });
});

在上面的示例中,我们使用 JestTestingModule 来创建一个测试模块,然后编写一个测试用例来验证控制器的 getUsers 方法是否正确返回用户数据。

结论

通过本博客,我们介绍了如何使用 Nest.js 构建企业级后端服务。您了解了如何创建控制器和服务、通过依赖注入管理服务之间的关系、使用中间件处理请求、进行身份验证和授权、使用数据访问对象 (DAO) 访问数据库以及编写单元测试和集成测试。

使用 Nest.js,您可以构建出高效、可维护和可测试的企业级后端应用程序。祝您在使用 Nest.js 开发后端服务时取得成功!

更多关于 Nest.js 的信息,请访问 Nest.js 官方网站

相似文章

    评论 (0)