Node.js的热门框架:Nest.js特性、常用功能和代码示例介绍以及与Midway.js的对比分析

560 阅读11分钟

更多技术信息请关注公众号:CTO Plus,获取更多。

图片.png 原文:Node.js的热门框架:Nest.js特性、常用功能和代码示例介绍以及与Midway.js的对比分析

图片

一、Nest.js是什么

Nest.js是一个基于Node.js的服务器端开发框架,它采用了现代化的架构和设计模式,使得开发者可以更加高效地构建可扩展、模块化、松耦合的应用程序。Nest.js的设计哲学主要是借鉴了Angular框架的思想,它提供了一系列的工具和功能,使得开发者可以以更加面向对象的方式进行开发,并且可以很方便地进行单元测试和集成测试。

 

Nest.js是用于构建高效且可伸缩的服务端应用程序的渐进式 Node.js 框架。支持 Typescript 、面向 AOP 编程、支持 typeorm、Node.js 版的spring、构建微服务应用。

 

NestJS 是一个精心制作的服务器端(后端)应用程序框架,以支持开发人员的更高效的生产力,它不仅是一个框架,它还是进入领域驱动设计,事件采购,微服务架构等先进工程概念领域的推动者。所有软件包都以简单轻量级的形式打包,以便可以选择 – 无论您决定使用整个框架还是仅重新使用其组件。

 

Node.js 和包管理器 NPM 提供了功能全面的服务器端环境,灵活性强,运行速度极快,对开发人员来说具有巨大的灵活性,从而将开发到生产的时间缩短到几小时,而不是几天。

 

图片

二、Nest.js的特性和作用

 

NestJS 是一个完全用TypeScript 编写的框架(它也支持 JS ),它很容易测试,并且带来了所有必要的东西。

 

  1. 可扩展性:Nest.js采用了模块化的设计,可以将应用程序拆分成多个模块,每个模块可以独立开发、测试和部署,从而提高了应用程序的可扩展性。

 

  1. 松耦合:Nest.js采用了依赖注入的方式(依赖注入容器),NestJS 带有自己的 DiC,这是一个在 JavaScript 世界中似乎被遗忘的实用工具,但确实是很实用,有一些解决方案像Inversify 或 Bottle,但 NestJS 有自己的解决方案。它也支持工厂注入。这个特性使得模块之间的依赖关系更加松耦合,从而提高了应用程序的可维护性和可测试性。

 

  1. 面向对象:Nest.js采用了面向对象的设计模式,使得开发者可以更加高效地进行开发,并且可以很方便地进行单元测试和集成测试。

 

  1. 兼容性:Nest.js兼容Express.js和Fastify等常见的Node.js框架,可以很方便地进行迁移和集成。

 

  1. 丰富的工具和功能:Nest.js提供了丰富的工具和功能,如路由、中间件、异常处理、日志、缓存、ORM等,使得开发者可以更加高效地进行开发。

 

  1. 模块化:在 Nest.js 中,处于相同域边界内的应用程序的每个逻辑部分都是一个模块,它鼓励封装。

 

  1. 可测试性 – 由于引入了 DiC 和 Modularisation,可以根据服务构建应用程序, 使控制器的工作更容易进行测试。在使用 TypeScript 了,支持更好的类型声明,可以给一个变量分配类型,减少可能出现的错误。

 

三、Nest.js的常用功能和代码示例

 

1. 路由

 

Nest.js的路由功能基于Express.js和Fastify,可以很方便地进行路由配置和请求处理。

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

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

2. 中间件

 

Nest.js的中间件功能可以拦截请求和响应,并且可以进行一些处理,如身份验证、日志记录等。

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();
  }
}

3. 异常处理

Nest.js的异常处理功能可以捕获应用程序中的异常,并且可以进行一些处理,如返回错误信息等。

import { ExceptionFilter, Catch, HttpException, ArgumentsHost } from '@nestjs/common';

@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();
    const message = exception.message;

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

4. 日志

Nest.js的日志功能可以记录应用程序的日志,包括请求日志、错误日志等。

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

const logger = new Logger('AppController');

export class AppController {
  findAll() {
    logger.log('Find all...');
  }
}

5. 缓存

 

Nest.js的缓存功能可以缓存应用程序中的数据,以提高应用程序的性能。

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

@Injectable()
export class CatsService {
  @UseInterceptors(CacheInterceptor)
  findAll(): Promise<Cat[]> {
    return this.catsRepository.findAll();
  }
}

6. ORM

 

Nest.js支持多种ORM(对象关系映射)框架,包括TypeORM、Sequelize、Mongoose等,这些ORM框架可以帮助开发者更方便地进行数据库操作。

 

下面是一个使用TypeORM的ORM示例代码:

 

  1. 安装TypeORM和相关依赖

 

npm install typeorm @nestjs/typeorm mysql

 

  1. 配置数据库连接

 

在app.module.ts文件中添加以下代码:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { User } from './user.entity';

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


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

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

  @Column()
  name: string;

  @Column()
  age: number;

  @Column()
  email: string;
}

 

  1. 创建实体

 

在user.entity.ts文件中添加以下代码:

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

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

  @Column()
  name: string;

  @Column()
  age: number;

  @Column()
  email: string;
}

 

  1. 创建服务

 

在user.service.ts文件中添加以下代码:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

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

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

  async create(user: User): Promise<User> {
    return await this.userRepository.save(user);
  }
}

 

  1. 创建控制器

在user.controller.ts文件中添加以下代码:

import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  async findAll(): Promise<User[]> {
    return this.userService.findAll();
  }

  @Post()
  async create(@Body() user: User): Promise<User> {
    return this.userService.create(user);
  }
}

以上示例代码展示了如何使用TypeORM进行数据库操作,包括数据库连接、实体创建、服务创建和控制器创建。开发者可以根据自己的需求和实际情况进行修改和扩展。

 

四、Nest.js的应用场景

 

Nest.js适用于构建各种类型的应用程序,包括Web应用程序、API服务、微服务等。特别是对于大型的、复杂的应用程序,Nest.js的模块化、松耦合、可扩展的设计可以提高应用程序的可维护性和可测试性,从而大大降低了开发和维护的成本。此外,Nest.js也适用于开发高性能的、具有实时性要求的应用程序,如在线游戏、实时聊天等。

更多关于Node.js的技术信息请关注公众号:CTO Plus后续的文章。

图片.png

五、Nest.js和Midway.js的区别、受欢迎程度以及优缺点分析对比

 

 

Nest.js和Midway都是基于Node.js的Web框架,但它们之间存在一些区别。下面是它们的区别、受欢迎程度以及优缺点的分析对比:

 

区别

 

  1. 设计理念不同:Nest.js的设计理念是基于Angular框架的,它提供了一些类似于Angular的特性,例如依赖注入、模块化、装饰器等。而Midway的设计理念是基于Egg.js的,它提供了一些类似于Egg.js的特性,例如插件机制、配置文件、中间件等。

 

  1. 架构不同:Nest.js的架构是基于MVC模式的,它将应用程序分为控制器、服务和模型。而Midway的架构是基于IOC和AOP的,它将应用程序分为控制器、服务、数据访问对象和切面。

 

  1. 社区生态不同:Nest.js的社区生态相对较新,但正在迅速发展。Midway的社区生态相对较成熟,已经有许多插件和中间件可供选择。

 

受欢迎程度

 

  1. Nest.js:Nest.js是一个相对较新的框架,但已经获得了广泛的关注和使用。根据GitHub上的星标数,Nest.js已经超过了57,000个星标。个人推荐使用Nest.js。

 

  1. Midway.js:Midway是一个相对较新的框架,但已经在中国的Node.js社区中获得了广泛的关注和使用。根据GitHub上的星标数,Midway已经超过了6,000个星标。

 

优缺点分析对比

 

1. Nest.js的优点:

 

  • 设计理念清晰,易于理解和使用。

  • 支持依赖注入、模块化、装饰器等特性,使得代码更加简洁和可维护。

  • 提供了丰富的文档和示例,使得开发人员能够快速上手。

  • 社区生态正在迅速发展,已经有许多插件和中间件可供选择。

 

2. Nest.js的缺点:

 

  • 相对较新的框架,可能存在一些不稳定性和兼容性问题。

  • 某些特性可能需要一些学习成本,例如依赖注入和装饰器等。

 

3. Midway的优点:

 

  • 基于Egg.js的设计理念,易于理解和使用。

  • 提供了丰富的插件和中间件,使得开发人员能够快速构建应用程序。

  • 社区生态相对较成熟,已经有许多插件和中间件可供选择。

 

4. Midway的缺点:

 

  • 对于不熟悉Egg.js的开发人员,可能需要一些学习成本。

  • 相对于Nest.js,Midway的文档和示例可能相对较少。

总之,Nest.js和Midway都是优秀的Node.js Web框架,它们都有自己的优点和缺点。开发人员可以根据自己的需求和经验选择适合自己的框架。

参考资料:

Nest.js官网:nestjs.bootcss.com/

Midway.js官网:www.midwayjs.org/

Nest.js github地址:github.com/nestjs/nest

Midway.js github地址:github.com/midwayjs/mi…

Nest.js中文指南:docs.nestjs.cn/9/firststep…

大前端专栏
blog.csdn.net/zhouruifu20…

更多精彩,关注我公号 ,一起学习、成长 图片.png

Node.js系列文章推荐阅读: