nestjs - 01

本文详细介绍NestJS中配置版本控制、跨域、中间件、文件上传与下载等功能的具体实现方式,帮助开发者快速掌握NestJS的进阶用法。

1. 开启配置版本号

   import { VersioningType, Post, Get, Version } from '@nestjs/common'
   app.enableVersioning({
     // 版本号
     type: VersioningType.URI
   })
   
   // 1、路由整体配置
   @Controller({
     path: 'user', // 路由名称
     version: '1', // 版本号
   })
   export class UserControlelr {
   }
   // 2、子路由配置
   @Controller('user')
   export class UserController {
     @Get()
     @Version('1') // 版本号
     findAll() {
       return 'this is find all user'
     }
   }
   

2. 跨域配置

   import * as cors from 'cors'
   app.use(cors())
   

3. 全局中间价

   import Logger from './middleware'
   app.use(middleware)

4. 上传图片配置

1. 安装模块

      npm install multer -S
      npm install @types/multer -D

2. 配置UploadModule

      
      import { UploadController } from './upload.controller'
      import { MulterModule } from '@nestjs/platform-express'
      import { diskStorage } from 'multer'
      import { join, extname } from 'path'
      @Module({
        imports: [MulterModule.register({
          storage: diskStorage({
            destination: join(__dirname, '../images'),
            filename: (_, file, callback) => {
              const filename = `${new Date().getTime() + extname(file.originalname)}`
              return callback(null, filename)
            }
          })
        })],
        constrollers: [UploadController]
      })
      export class UploadModule {}

3. 配置UploadController

      import { useInterceptors, UploadedFile } from '@nestjs/common'
      import { 
        FileInterceptor, // 单文件
        FileFieldsInterceptor // 多文件
      } from '@nestjs/platform-express'
      
      @Controller('upload')
      export class UploadController {
        constructor() {}
        
        @Post('album')
        // 定义前端上传文件的参数名 
        @UseInterceptors(@FileInterceptor('file')) // 单个图片上传,file
        upload(@UploadFile() file) {
          console.log('file:', file)
          // 返回给客户端的信息
          return {
            code: 200,
            msg: 'ok'
          }
        }
      }

4. 配置静态资源访问目录

      import { NestFactory } from '@nestjs/core'
      import { AppModule } from './app.module'
      // 1、需要引入一个类型, 类型定义了一个 useStaticAssets 方法
      import { NestExpressApplication } from '@nestjs/platform-express'
      
      // 2、在app 上配置
      async function bootstrap() {
        const app = await NestFactory.create<NestExpressApplication>(AppModule)
        app.useStaticAssets(path.join(__dirname, 'images'), {
          prefix: '/dist',  // 自定义文件路径 
        })
      }

5. 下载静态资源

      import { Get, Res } from '@nestjs/common'
      import { Response } from 'express'
      import { join } from 'path'
      import { zip } from 'compressing'
      @Controler('upload')
      export class UploadControler {
        // 1、直接下载
        @Get('export')
        download(@Res res: Response) {
          const url = join(__dirname, '../images/filename.png')
          res.download(url)
        }
        
        // 2、文件流下载
        // 安装模块:npm i compressing
        @Get('stream')
        async down(@Res res: Response) {
          const url = join(__dirname, '../images/filename.png')
          const tarStream = new zip.Stream()
          await tarStream.addEntry(url)
          // 设置流响应头,固定写法
          res.setHeader('Content-Type', 'application/octet-stream')
          res.setHeader('Content-Disposition', 'attachment/* 可以加入自定义参数 eg: ;fliename=chao;custom=li; */')
          
          // 返回给前端
          tarStream.pipe(res)
        }
      }
web端请求
      // 1、直接下载
      function download() {
        window.open('http://localhost:3000/upload/export')
      }
      
      // 2、以流的方式下载(安全,可以处理、加密等)
      async function download() {
        // 1、axios请求
        const res = await axios.get('http://localhost:3000/upload/stream', {
          responseType: 'blob', // 流文件必须得配置
        })
        const blob = new Blob([res.data])
        // 2、fetch请求
        // const res = await fetch(url).then(res => res.arrayBuffer())
        // const blob = new Blob([res])
        
        cosnt url = URL.createObjectURL(blob)
        const a = document.createElement('a')
        a.href = url
        a.download = 'filename.zip'
        a.click()
      }
NestJS 应用中集成 Consul 进行服务发现,可以通过以下步骤实现: ### 1. 安装 Consul 和相关依赖 首先确保本地环境中已安装 Consul,并启动其开发模式。在 Windows 系统中,可以访问 [Consul 下载页面](https://www.consul.io/downloads) 获取可执行文件,并将其配置到系统环境变量中。测试安装是否成功,可在命令行运行: ```bash consul -v ``` 启动 Consul 的开发模式: ```bash consul agent -dev ``` 接着,在 NestJS 项目中安装必要的依赖包,例如 `consul` Node.js 客户端库: ```bash npm install consul ``` ### 2. 实现 Consul 服务注册功能 创建一个 Consul 配置模块或服务用于处理服务注册逻辑。示例代码如下: ```typescript import { Injectable } from '@nestjs/common'; import * as Consul from 'consul'; @Injectable() export class ConsulService { private readonly consul: Consul; constructor() { this.consul = new Consul(); } async registerService(serviceId: string, serviceName: string, port: number): Promise<void> { const serviceOptions = { id: serviceId, name: serviceName, address: '127.0.0.1', port: port, check: { http: `http://localhost:${port}/health`, interval: '10s', }, }; await this.consul.agent.service.register(serviceOptions); } } ``` 该服务定义了一个方法 `registerService`,它将当前 NestJS 微服务注册到 Consul 中,并设置健康检查路径。 ### 3. 在应用启动时注册服务 通过 NestJS 的生命周期钩子 `onModuleInit` 或使用自定义启动脚本触发服务注册操作: ```typescript import { Injectable, OnModuleInit } from '@nestjs/common'; import { ConsulService } from './consul.service'; @Injectable() export class AppModule implements OnModuleInit { constructor(private readonly consulService: ConsulService) {} async onModuleInit(): Promise<void> { await this.consulService.registerService('nestjs-service-01', 'nestjs-service', 3000); } } ``` 此代码将在模块初始化阶段自动调用 `registerService` 方法,向 Consul 注册服务[^1]。 ### 4. 查询并发现其他服务 为了从 Consul 中发现其他微服务,可以添加查询方法来获取服务实例列表: ```typescript async discoverServices(serviceName: string): Promise<Consul.Agent.Service[]> { const services = await this.consul.catalog.service.nodes(serviceName); return services; } ``` 该方法会返回指定名称的所有可用服务节点信息,包括 IP 地址和端口等数据[^2]。 ### 5. 结合 API 网关进行负载均衡(可选) 如果采用 API 网关模式,可以在网关层集成 Consul 客户端以动态路由请求到合适的后端服务实例上。例如,在网关服务中监听 Consul 中的服务变更事件,并根据策略选择目标服务实例进行转发。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值