学习NestJS的第一个接口(一)

2024-09-11 10:40:46 浏览数 (2)

NestJS:Node.js最受欢迎的框架之一

以前开发小程序api使用过Express.js、Koa.js等框架,最近想用NestJS重构自己的几个小程序后台,所以从零开始学习NestJS框架。

目前Node.js 最受欢迎的框架通常指的是那些为了简化 Node.js 应用程序开发而创建的库或工具。以下是一些最受欢迎的框架:

  1. Express.js - 这是一个简化 Node.js 应用程序开发的非常流行的框架。它提供了一个轻量级的web应用程序服务器,可以快速地搭建一个web服务器。
  2. Koa.js - 是下一代的 Express.js 框架,使用了更现代的中间件API。
  3. Hapi.js - 另一个强大的 Node.js 框架,提供了丰富的功能和强大的插件系统。
  4. Nest.js - 是一个用于构建高效、可扩展的Node.js服务器端应用的框架。它使用了OOP(面向对象编程)的概念,并结合了函数式编程的模式。

下面我们主要介绍下NestJS

NestJS 具有架构设计合理、功能特性丰富、开发效率高、性能和可扩展性好等优势,是构建 Node.js 服务器端应用程序的理想选择

一、架构设计

1.模块化架构

  • NestJS 采用模块化的架构设计,使得代码结构清晰、易于维护。每个模块可以专注于特定的业务功能,模块之间的依赖关系明确,方便开发人员进行代码组织和管理。
  • 例如,一个电商应用可以分为用户模块、商品模块、订单模块等,每个模块都有自己的控制器、服务和实体,模块之间通过依赖注入进行交互。

2.面向对象编程(OOP)风格

  • 借鉴了面向对象编程的思想,提供了类、接口、装饰器等特性,使得代码更加直观、易于理解和扩展。
  • 例如,可以使用类来定义控制器、服务和实体,通过装饰器来添加元数据,提高代码的可读性和可维护性。 3.依赖注入
  • 强大的依赖注入系统,使得模块之间的耦合度降低,提高了代码的可测试性和可维护性。开发人员可以轻松地替换模块的实现,而不影响其他部分的代码。
  • 例如,可以通过依赖注入将数据库连接对象注入到服务中,使得服务可以方便地访问数据库,而不需要在服务内部硬编码数据库连接的细节。

二、功能特性

1.支持多种后端技术

  • NestJS 可以与多种后端技术集成,如 TypeScript、Express.js、Fastify 等。这使得开发人员可以根据项目的需求选择合适的技术栈,提高开发效率。
  • 例如,如果需要高性能的服务器,可以选择使用 Fastify;如果需要更好的类型安全和开发体验,可以选择使用 TypeScript。

2.内置的功能模块

  • 提供了许多内置的功能模块,如路由、中间件、验证、异常处理等,减少了开发人员的工作量。这些模块经过精心设计和优化,具有良好的性能和稳定性。
  • 例如,可以使用 NestJS 的路由模块来定义 API 路由,使用验证模块来对输入数据进行验证,使用异常处理模块来统一处理应用程序中的异常。

3.支持微服务架构

  • NestJS 支持构建微服务架构,可以轻松地将应用程序拆分为多个独立的服务,每个服务可以独立部署和扩展。这使得应用程序具有更好的可扩展性和高可用性。
  • 例如,可以使用 NestJS 的微服务模块来构建一个分布式的电商系统,将用户服务、商品服务、订单服务等拆分为独立的微服务,通过消息队列进行通信。

三、开发效率

1.代码生成器

  • NestJS 提供了代码生成器,可以快速生成模块、控制器、服务等代码结构,减少了手动编写代码的工作量。开发人员可以通过命令行工具或集成开发环境(IDE)插件来使用代码生成器。
  • 例如,可以使用 nest generate module user 命令来生成一个用户模块,包括控制器、服务和实体等文件。

2.良好的文档和社区支持

  • NestJS 拥有详细的文档和活跃的社区,开发人员可以方便地获取帮助和解决问题。文档内容丰富,包括教程、示例代码、API 参考等,方便开发人员快速上手。
  • 社区活跃,有许多开发者分享经验和解决方案,遇到问题时可以在社区中寻求帮助。

3.与前端框架集成方便

  • NestJS 可以与各种前端框架(如 Angular、React、Vue.js 等)集成,实现前后端分离的开发模式。通过使用 API 网关或代理服务器,可以方便地将前端请求转发到后端服务。
  • 例如,可以使用 NestJS 构建一个 API 网关,将前端的请求转发到不同的微服务,实现统一的入口和路由管理。

四、性能和可扩展性

1.高性能

  • NestJS 基于 Node.js 运行时,具有良好的性能表现。它可以处理大量的并发请求,并且响应速度快。此外,NestJS 还可以通过使用缓存、异步编程等技术来进一步提高性能。
  • 例如,可以使用缓存中间件来缓存频繁访问的数据,减少数据库查询的次数,提高响应速度。

2.可扩展性

  • 由于采用了模块化架构和依赖注入,NestJS 具有良好的可扩展性。可以轻松地添加新的功能模块、扩展现有模块的功能,或者替换模块的实现。
  • 例如,如果需要添加一个新的支付功能,可以创建一个支付模块,并将其集成到现有的电商系统中。
NestJS的第一个接口 Hello World!
代码语言:bash复制
npm i -g @nestjs/cli // 全局安装Nest 

nest new project-name // 创建项目

我们选择yarn 初始化项目

yarn 初始化项目yarn 初始化项目

本地环境yarn 1.22.22、node 21.7.2

yarn startyarn start
代码语言:typescript复制
 import { Controller, Get } from '@nestjs/common';



   @Controller()

   export class AppController {

     @Get()

     getHello(): string {

       return 'Hello World!';

     }

   }

yarn start

app.module.ts

代码语言:typescript复制
import { Module } from '@nestjs/common';

import { AppController } from './app.controller';

import { AppService } from './app.service';

@Module({

  imports: [],

  controllers: [AppController],

  providers: [AppService],

})

export class AppModule {}

app.service.ts

代码语言:typescript复制
import { Injectable } from '@nestjs/common';



@Injectable()

export class AppService {

  getHello(): string {

    return 'Hello World!';

  }

}

app.controller.ts

代码语言:typescript复制
import { Controller, Get } from '@nestjs/common';

import { AppService } from './app.service';



@Controller()

export class AppController {

  constructor(private readonly appService: AppService) {}



  @Get()

  getHello(): string {

    return this.appService.getHello();

  }

}

main.ts

代码语言:typescript复制
declare const module: any;

import { NestFactory } from '@nestjs/core';

import { AppModule } from './app.module';



async function bootstrap() {

  const app = await NestFactory.create(AppModule);

  await app.listen(3001);

  if (module.hot) {

    module.hot.accept();

    module.hot.dispose(() => app.close());

  }

}

bootstrap();
Hello World!Hello World!
NestJS热更新
使用 NestJS 内置的开发服务器(需要安装 @nestjs/cli******)**
1.使用 ts-node-dev
  1. 安装 ts-node-dev
代码语言:bash复制
npm install -D ts-node-dev
  1. 修改启动脚本:
代码语言:bash复制
在 `package.json` 文件中,将启动脚本修改为使用 `ts-node-dev`。
代码语言:json复制
"scripts": { "start": "ts-node-dev --respawn --transpile-only src/main.ts" }
2. run-script-webpack-plugin
代码语言:bash复制
 yarn add webpack-node-externals run-script-webpack-plugin webpack
代码语言:json复制
"start:dev": "webpack --config webpack.config.js --watch",

webpack.config.js

代码语言:javascript复制
const webpack = require('webpack');

const path = require('path');

const nodeExternals = require('webpack-node-externals');

const { RunScriptWebpackPlugin } = require('run-script-webpack-plugin');



module.exports = {

  entry: ['webpack/hot/poll?100', './src/main.ts'],

  target: 'node',

  externals: [

    nodeExternals({

      allowlist: ['webpack/hot/poll?100'],

    }),

  ],

  module: {

    rules: [

      {

        test: /.tsx?$/,

        use: 'ts-loader',

        exclude: /node_modules/,

      },

    ],

  },

  mode: 'development',

  resolve: {

    extensions: ['.tsx', '.ts', '.js'],

  },

  plugins: [

    new webpack.HotModuleReplacementPlugin(),

    new RunScriptWebpackPlugin({ name: 'server.js' }),

  ],

  output: {

    path: path.join(__dirname, 'dist'),

    filename: 'server.js',

  },

};webpack.config.js
3.启动开发服务器 --watch

在项目根目录下运行以下命令启动开发服务器:

代码语言:bash复制
nest start --watch

这个命令会启动一个开发服务器,并监视文件的变化。当文件发生变化时,服务器会自动重新加载。

这些方法可以帮助你在开发过程中实现热更新,提高开发效率。根据你的项目需求和偏好选择适合的方法。

开始写这篇文章的时候,我已经把自己的小程序后台koa项目改造成了NestJS。后续还会写NestJS使用ORM、如何在NestJS中添加日志、jwt token处理、全局错误处理、接口参数校验、redis缓存、图片上传等等

0 人点赞