nestJS入门cli 创建项目以及集成swagger和mysql

news/2024/7/19 15:57:57 标签: nest, Nestjs, nodejs, js

nestJs_0">nestJs

1. 简介

介绍 NestJS NestJS 是一个基于 TypeScript 的渐进式 Node.js 框架,它结合了 OOP、FP 和 FRP 的元素,以提供一种现代且可扩展的开发体验。NestJS 建立在 Express.js 之上,但是提供了更加抽象和模块化的方式来编写应用程序。NestJS 提供了许多关键功能,如依赖注入、面向切面编程、中间件、异常过滤、WebSocket、GraphQL 等。它还内置了支持多种数据库(如 MongoDB、MySQL、PostgreSQL)的 ORM 和 ODM 库,以及对测试的良好支持。

2. NestJS 的核心概念

模块化编程 NestJS 强调模块化编程思想,将各个模块分开以达到解耦的目的。

浅谈控制反转和依赖注入

  • 控制反转(IoC)是一种思想,其中一个典型的实现方式就是使用依赖注入(DI)
  • 什么是控制反转,顾名思义失去控制,反转控制权,主要是为了解耦组件之间的依赖关系,提高代码的可维护性和扩展性。 IoC指的是将控制流程交给框架或容器来管理,而不是在应用程序自己的代码中硬编码实现。这意味着应用程序不再需要自己创建和管理对象的生命周期,而是由框架或容器来负责。
  • 什么是依赖注入,DI指的是通过构造函数、属性或方法参数等方式,在组件创建时向其传递依赖的对象,也就是将组件所依赖的对象“注入”到组件中。这样组件就不需要自己创建和管理依赖的对象了,而是由其他组件或框架来负责创建和管理。这样可以降低组件之间的耦合度,同时也方便了单元测试和代码重用。

控制器和路由 控制器负责处理接收到的请求,并返回响应。路由是控制器的一部分,负责将请求映射到相应的控制器方法。

提供程序和依赖注入 提供程序是一个类或者值,可以被注入到控制器或其他提供程序中。依赖注入是指这些提供程序在运行时被动态注入到控制器或其他提供程序中。

中间件和异常处理 中间件是在请求和响应之间的操作,例如身份验证、日志记录等。异常处理是在捕获异常后处理异常的过程。

WebSocket 和 GraphQL NestJS 对 Websocket 和 GraphQL 也有丰富的支持,它们都可以通过 NestJS 的装饰器和模块来实现。

3. NestJS 开发基础

NestJS中文文档

npm i -g @nestjs/cli  // 全局安装Nest
nest new demo  // 创建项目

安装和配置 使用 npm 或者 yarn 可以安装 NestJS,并根据需要进行配置。

模块和模块之间的关系 NestJS 强调模块化编程思想,因此所有的功能都必须在模块内定义。

路由和控制器 路由是负责将请求映射到相应的控制器方法,而控制器则负责处理接收到的请求,并返回响应。 Nest.js中没有单独配置路由的地方,而是使用装饰器。Nest.js中定义了若干的装饰器用于处理路由。

提供程序和依赖注入 提供程序是一个类或者值,可以被注入到控制器或其他提供程序中。依赖注入是指这些提供程序在运行时被动态注入到控制器或其他提供程序中。

nestJS_CLI__40">nestJS CLI 常用命令

# 生成controller.ts
 $nest g co user
# 生成  module.ts
 $nest g mo user
# 生成service.ts
 $nest g s user
# 直接使用一个命令生成CURD
 $nest g resource user

在这里插入图片描述

4. NestJS 进阶开发

中间件的使用和自定义中间件 NestJS 内置了一些常用的中间件,例如 CORS、Body Parser 等,同时也支持自定义中间件。

异常处理和自定义异常 异常处理是在捕获异常后处理异常的过程。NestJS 内置了一些常见的异常类,也支持自定义异常。

WebSocket 的使用和实现 NestJS 可以很方便地支持 WebSocket,只需要使用相应的装饰器和模块即可。

GraphQL 和 RESTful API 的比较以及如何实现 GraphQL NestJS 对 GraphQL 有着良好的支持,可以使用它来替代传统的 RESTful API。

集成swagger

  • 安装swagger
yarn add @nestjs/swagger swagger-ui-express --save
import { NestFactory } from '@nestjs/core';
import { ParseIntPipe } from '@nestjs/common';
import { AppModule } from './app.module';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  //全局使用管道:这里使用的是内置,也可以使用自定义管道,在下文
  app.useGlobalPipes(new ParseIntPipe());
  app.setGlobalPrefix('api');
  //全局使用中间件
  // app.use(LoggerMiddleware);

  // //全局使用过滤器
  // //这里使用的是自定义过滤器,先别管,先学会怎么在全局使用
  // app.useGlobalFilters(new HttpExceptionFilter());

  // //全局使用守卫
  // app.useGlobalGuards(new AuthGuard());

  // //全局使用拦截器
  // app.useGlobalInterceptors(new AuthInterceptor());
  const config = new DocumentBuilder()
    .setTitle('demo')
    .setDescription('nestJs项目的API使用文档')
    .setVersion('1.0.0')
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('/api', app, document);
  await app.listen(4010);
}
bootstrap();

集成TypeORM和MySql

为了开始使用它,我们首先安装所需的依赖项。在本章中,我们将演示如何使用流行的关系型数据库 Mysql , TypeORM 提供了对许多关系数据库的支持,比如 PostgreSQL 、Oracle、Microsoft SQL Server、SQLite,甚至像 MongoDB 这样的 NoSQL 数据库。

为了与 SQL和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。Nest 使用TypeORM是因为它是 TypeScript 中最成熟的对象关系映射器( ORM )。因为它是用 TypeScript 编写的,所以可以很好地与 Nest 框架集成。

  • 安装mysql以及navicat

  • 安装TypeORM

yarn add --save @nestjs/typeorm typeorm mysql2

官方提供了两种连接数据库的方法:

方法1

首先在项目根目录下创建两个文件.env和.env.prod,分别存的是开发环境和线上环境不同的环境变量:(.env.prod中的是上线要用的数据库信息,如果你的项目要上传到线上管理,为了安全性考虑,建议这个文件添加到.gitignore中)

json">// 数据库地址
DB_HOST=localhost  
// 数据库端口
DB_PORT=3306
// 数据库登录名
DB_USER=root
// 数据库登录密码
DB_PASSWD=root
// 数据库名字
DB_DATABASE=test

接着在根目录下创建一个文件夹config(与src同级),然后再创建一个env.ts用于根据不同环境读取相应的配置文件。

js">
import * as fs from 'fs';
import * as path from 'path';
const isProd = process.env.NODE_ENV === 'production';
 
function parseEnv() {
  const localEnv = path.resolve('.env');
  const prodEnv = path.resolve('.env.prod');
 
  if (!fs.existsSync(localEnv) && !fs.existsSync(prodEnv)) {
    throw new Error('缺少环境配置文件');
  }
 
  const filePath = isProd && fs.existsSync(prodEnv) ? prodEnv : localEnv;
  return { path:filePath };
}
  • app.module.ts
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService, ConfigModule } from '@nestjs/config';
import envConfig from './config/env';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true, // 设置为全局
      envFilePath: [envConfig.path],
    }),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        type: 'mysql', // 数据库类型
        entities: [], // 数据表实体
        host: configService.get('DB_HOST', 'localhost'), // 主机,默认为localhost
        port: configService.get<number>('DB_PORT', 3306), // 端口号
        username: configService.get('DB_USER', 'root'), // 用户名
        password: configService.get('DB_PASSWORD', 'root'), // 密码
        database: configService.get('DB_DATABASE', 'test'), //数据库名
        timezone: '+08:00', //服务器上配置的时区
        synchronize: true, //根据实体自动创建数据库表, 生产环境建议关闭
      }),
    }),
    UsersModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

警告:设置 synchronize: true 不能被用于生产环境,否则您可能会丢失生产环境数据

方法二
  • app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

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

在这里插入图片描述


http://www.niftyadmin.cn/n/289891.html

相关文章

mysql数据库高级操作

文章目录 一、克隆表1.方法一2.方法二 二、清空表&#xff0c;删除表内所有数据1.方法一2.方法二3.drop、truncate、delete对比 三、创建临时表四、用户管理五、忘记root密码的解决措施六、用户授权总结 一、克隆表 1.方法一 ​create table 新表名 like 复制的表名; ​ ​复…

【APSIM模型】高级应用及批量模拟

APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生长模拟模型之一。APSIM模型有Classic和Next Generation两个系列模型&#xff0c;能模拟几十种农作物、牧草和树木的土壤-植物-大气过程&#xff0c;被广泛应用于精细农业、水肥管理、气候变化、粮食安…

Java时间类(八)-- Instant (时间戳类)(常用于Date与LocalDateTime的相互转化)

目录 1. Instant的概述: 2. Instant的常见方法: 3. Date --->Instant--->LocalDateTime 4. LocalDateTime --->Instant--->Date 1. Instant的概述

英文论文(sci)解读复现【NO.7】基于注意机制的改进YOLOv5s目标检测算法

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

Wikidata实操

1. Wikidata 简介 Wikidata 即维基数据&#xff0c;是维基百科的一个项目。个项目已经在维基百科德国分部开始进行&#xff0c;项目完成之后&#xff0c;将会交给维基百科基金会进行操作和维护。&#xff08;具体百度即可&#xff0c;不多赘述&#xff09; 官网&#xff1a;htt…

前端学习之使用JavaScript(2)

前情回顾&#xff1a;基本 存储类型 数组 Js的数组与其它语言的数组有很大的区别。跟其他语言中的数组一样&#xff0c;ECMAScript 数组也是一组有序的数据。但是&#xff0c;Js的一个数组中可以存储不同类型的数据。 // 数组字面量表示法 let array [1, 2, true];// 构造…

阿里版ChatGPT——通义千问,开箱初体验

所有行业、所有应用、所有服务都值得基于新型人工智能技术重做一遍&#xff0c;在带来创造性客户体验的同时&#xff0c;生产范式、工作范式、生活范式也将发生变化。——阿里集团董事会主席兼CEO 张勇 2023阿里云峰会上&#xff0c;通义千问大语言模型对外发布&#xff0c;宣称…

模糊PID模糊控制(清晰化方法梯形图实现)

模糊PID的模糊化请参看下面的博客文章: 博途PLC模糊PID三角隶属度函数指令(含Matlab仿真)_plc 模糊pid_RXXW_Dor的博客-CSDN博客三角隶属度函数FC,我们采用兼容C99标准的函数返回值写法,在FB里调用会更加直观,下面给大家具体讲解代码。常规写法的隶属度函数FC可以参看下…