nestjs笔记

这篇具有很好参考价值的文章主要介绍了nestjs笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

控制反转 IoC

控制反转(Inversion of Control,缩写为 IoC)是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

网关

import { NestFactory } from '@nestjs/core';
import {
  FastifyAdapter,
  NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter(),
  );
  await app.listen(3000);
}
bootstrap();

版本控制

单个请求控制
// main.ts. 接口版本化管理
  app.enableVersioning({
    type: VersioningType.URI,
  });
// 在Controller中
import { Controller, Version } from '@nestjs/common';
 @Get()
 @Version('1') // add this line
 findAll() {
    return this.userService.findAll();
 }
多版本控制
// 全局配置请求控制


全局参数返回

统一响应体格式

全局异常拦截

base 异常
http异常
处理业务异常

环境配置

swager 文档配置

对接飞书 环境参数 alias配置

请求封装

参数校验 约束前端传参数

使用 class-validator 内置的验证装饰器对需要验证的 Dto 参数添加校验。

import { RECEIVE_TYPE, MSG_TYPE } from '@/helper/feishu/message';
import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsEnum } from 'class-validator';

export class FeishuMessageDto {
  @IsNotEmpty()
  @IsEnum(RECEIVE_TYPE)
  @ApiProperty({ example: 'email' })
  receive_id_type: RECEIVE_TYPE

  @IsNotEmpty()
  @ApiProperty({ example: 'cookieboty@qq.com' })
  receive_id?: string

  @IsNotEmpty()
  @ApiProperty({ example: '{\"text\":\" test content\"}' })
  content?: string

  @IsNotEmpty()
  @IsEnum(MSG_TYPE)
  @ApiProperty({ example: 'text' })
  msg_type?: MSG_TYPE
}

我们使用了 IsNotEmpty(禁止传空)以及 IsEnum(参数必须是有效的枚举)来约束前端传参数

装饰器 描述
常见的验证装饰器
@IsDefined(value: any) 检查值是否已定义(!== undefined, !== null)。这是唯一忽略 skipMissingProperties 选项的装饰器。
@IsOptional() 检查给定值是否为空(=== null,=== undefined),如果是,则忽略该属性上的所有验证器。
@Equals(comparison: any) 检查值是否等于 (“=“) 比较。
@NotEquals(comparison: any) 检查值是否不等于 (”!
”) 比较。
@IsEmpty() 检查给定值是否为空(=== ‘’、=== null、=== 未定义)。
@IsNotEmpty() 检查给定值是否不为空(!== ‘’,!== null,!== undefined)。
@IsIn(values: any[]) 检查值是否在允许值的数组中。
@IsNotIn(values: any[]) 检查 value 是否不在不允许的值数组中。
类型验证装饰器
@IsBoolean() 检查值是否为布尔值。
@IsDate() 检查值是否为日期。
@IsString() 检查字符串是否为字符串。
@IsNumber(options: IsNumberOptions) 检查值是否为数字。
@IsInt() 检查值是否为整数。
@IsArray() 检查值是否为数组
@IsEnum(entity: object) 检查值是否是有效的枚举
完成了参数校验后,还剩下最后一步,先看下现在的文档描述。
image.png

从上述页面中可以看出,接口字段描述使用 enum 类型在展示上并不直观,对接的前端同学无法感知到底用了什么、需要传什么值才能符合要求,这个可以使用 Swagger 中 ApiProperty 的 enum 参数,来让文档识别出对应的枚举参数:

QS

nestjs怎么检索SetMetadata设置的元数据

在 NestJS 中,可以使用 Reflector 类来检索通过 @SetMetadata 装饰器设置的元数据。以下是一个简单的示例:

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

// SetMetadata会返回一个
const Roles = (...roles: string[]) => SetMetadata('roles', roles);

@Controller('cats')
export class CatsController {
  constructor(private readonly reflector: Reflector) {}

  @Roles('admin')
  @Get()
  findAll() {
    const roles = this.reflector.get<string[]>('roles', this.findAll);
    console.log(roles); // ['admin']
    return 'This action returns all cats';
  }
}

在上面的示例中,@Roles(‘admin’) 装饰器使用 SetMetadata 来设置 roles 元数据。然后,我们在 findAll 方法中使用 Reflector 类的 get 方法来检索该元数据。该方法需要两个参数:要检索的元数据的键(这里是 ‘roles’)和装饰器所应用的目标对象(这里是 this.findAll,即 findAll 方法本身)。该方法返回一个包含元数据的数组(在本例中是 [‘admin’])。

####### ts是怎么实现元数据的

在 TypeScript 中,元数据是通过装饰器来实现的。装饰器是一种特殊类型的声明,可以附加到类声明、方法、属性或参数上,以修改类的行为。装饰器使用 @ 符号后跟一个表达式,并将其放置在要修饰的声明之前。

装饰器可以用来添加元数据,例如类型信息、注解和其他标记。这些元数据可以在运行时使用,以便执行特定操作。例如,Express 框架使用装饰器来定义路由处理程序,并从中构建路由表。

要访问元数据,可以使用 Reflect API 中的 reflect-metadata 库。该库提供了一组函数,可用于获取和设置元数据。例如,可以使用 reflect-metadata 库获取类的元数据:

import 'reflect-metadata';

class MyClass {
  // Define metadata for this class
}
const metadata = Reflect.getMetadata('myMetadataKey', MyClass);

在上面的示例中,我们使用 Reflect.getMetadata() 函数从 MyClass 中获取名为 ‘myMetadataKey’ 的元数据。

nestjs的Providers有什么用

在 NestJS 中,Providers 是一种特殊类型的类,用于管理应用程序中的依赖注入(Dependency Injection,DI)系统。简单来说,Provider 的作用就是将各个模块或组件的不同部分联系起来,使它们能够互相协作并实现功能。

在 NestJS 中,Providers 可以用于以下方面:

依赖注入:在应用程序中,Providers 可以被用来实现依赖注入(Dependency Injection,DI)。通过 DI,我们可以轻松地管理应用程序中的依赖关系,并使不同的组件之间相互独立。

单例模式:在 NestJS 中,Provider 通常是单例模式,这意味着我们可以将它们用来保存应用程序的全局状态。因为 Provider 只会被实例化一次,所以我们可以在不同的组件之间共享相同的数据。

模块管理:在 NestJS 中,Provider 通常是模块的一部分。这意味着我们可以将不同的 Provider 分组到不同的模块中,并在需要时轻松地加载它们。

可重用性:在 NestJS 中,Provider 可以轻松地重用,这意味着我们可以在不同的应用程序中使用相同的 Provider,从而提高代码的可维护性和可重用性。

总之,Provider 是 NestJS 中非常重要的概念之一,它使我们能够轻松地管理应用程序的依赖关系,并实现各种复杂的功能。

那nestjs的提供者和ts的装饰器有什么区别

NestJS提供者和TypeScript装饰器的作用是不同的。

TypeScript装饰器是一种语法糖,可以为类、属性、方法等添加元数据,以及在运行时修改它们的行为。而NestJS提供者是一种特殊类型的装饰器,它用于将一个类注入到应用程序中。

具体来说,NestJS提供者是一种特殊类型的类,它使用依赖注入(DI)机制在整个应用程序中共享实例。这些提供者被注入到控制器、服务或其他提供者中,以便在应用程序中实现组件的重用和松散耦合。

因此,尽管两者都使用装饰器语法,但它们的作用和使用方式是不同的。

用nestjs读取mp4文件并且给这个虎牙推流的demo

这个地址是一个RTMP协议的流媒体地址,它的主机名为"hs.direct.huya.com",RTMP是一种实时音视频流传输协议,常用于直播和视频会议等场景。

如果想用NestJS编写一个读取MP4文件并推流的demo,需要使用Node.js的流处理功能以及RTMP推流库。以下是实现这个demo的大致思路:

  1. 安装相关依赖库,比如fluent-ffmpeg、node-media-server等;
  2. 使用fluent-ffmpeg读取MP4文件,将其转为可被RTMP推流库处理的视频流;
  3. 创建一个RTMP服务器实例,并监听客户端的连接请求;
  4. 当有客户端连接到服务器时,将视频流推送给客户端。

下面是一个基本的示例代码:

import { Controller, Get } from '@nestjs/common';
import * as fs from 'fs';
import * as path from 'path';
import * as ffmpeg from 'fluent-ffmpeg';
import * as NodeMediaServer from 'node-media-server';

@Controller()
export class AppController {
  @Get()
  async stream() {
    const videoPath = path.join(__dirname, 'video.mp4');
    const stat = fs.statSync(videoPath);
    const fileSize = stat.size;

    const nms = new NodeMediaServer({
      rtmp: {
        port: 1935,
        chunk_size: 60000,
        gop_cache: true,
        ping: 60,
        ping_timeout: 30,
      },
    });

    nms.on('prePublish', (id, streamPath, args) => {
      console.log('[NodeEvent on prePublish]', `id=${id} streamPath=${streamPath} args=${JSON.stringify(args)}`);
      const stream = fs.createReadStream(videoPath);

      const avconv = new ffmpeg();
      avconv.input(stream)
        .inputFormat('mp4')
        .outputOptions('-c:v libx264')
        .outputOptions('-preset veryfast')
        .outputOptions('-tune zerolatency')
        .outputOptions('-profile:v baseline')
        .outputOptions('-level 3.0')
        .outputOptions('-b:v 300k')
        .outputOptions('-bufsize 600k')
        .outputOptions('-maxrate 400k')
        .outputOptions('-payload_type 99')
        .outputOptions('-f flv')
        .output(`rtmp://hs.direct.huya.com${streamPath}`);
      avconv.run();
    });

    await nms.run();
  }
}

在上面的示例代码中,我们首先通过fs模块读取了video.mp4文件,并获取了文件的大小。然后我们创建了一个NodeMediaServer实例,并配置了RTMP服务器的参数。

当有客户端连接到服务器时,我们通过fluent-ffmpeg将video.mp4文件转为可被RTMP推流库处理的视频流,并使用RTMP推流库将视频流推送给客户端。

这只是一个简单的示例,实际的应用可能需要更多的功能,比如授权、流控、转码、水印等。但是这个示例可以帮助你了解如何使用NestJS和Node.js的流处理功能来实现一个基本的RT文章来源地址https://www.toymoban.com/news/detail-435201.html

到了这里,关于nestjs笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nestjs笔记

    控制反转 IoC 控制反转(Inversion of Control,缩写为 IoC)是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的

    2024年02月03日
    浏览(22)
  • MATLAB:电机控制(Motor Control)

             花了好大心血完成了一份留学作业系列——1:电机控制设计;供大家参考,文末有MATLAB程序及无水印Word文档。         Control design is very important in for power electronics, such as the application on converters and motor control. In this lab, we will learn how to design a PI controller for a D

    2024年02月07日
    浏览(26)
  • 电脑风扇控制 -- Macs Fan Control Pro

    Macs Fan Control Pro是一款专业的Mac风扇控制软件,旨在帮助用户更好地管理和控制Mac电脑的风扇。该软件提供了实时监测风扇速度和温度的功能,以及自定义风扇转速策略设置,能够解决Mac电脑过热问题,并提高电脑性能和稳定性。同时,该软件还具有直观易用的界面和多种特

    2024年01月24日
    浏览(27)
  • Spring IoC (控制反转)

    IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则。 Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使

    2024年02月13日
    浏览(23)
  • 区块链的控制反转

    号外: 教链内参11.26《超80%流通盘处于浮盈》 控制反转这个词儿来自于计算机软件的一种设计模式,英文称为Inversion of Control,缩写是IoC。教链借用这个术语,来指称在区块链系统中,消除传统的“人控制机器”的控制模式,反转为“机器控制人”的控制反转模式。 掌握了这

    2024年02月05日
    浏览(38)
  • netcore控制反转

    IoC Ioc优点 接口IMyservice 实现接口类 配置依赖注入在Startup.cs中 在控制器中注入依赖项

    2024年02月17日
    浏览(30)
  • AI 与控制:神经网络模型用于模型预测控制(Model Predictive Control)

    最优控制理论处理的问题通常是找到一个满足容许控制的 u*,把它作用于系统(被控对象)ẋ(t)=f(x(t),u(t),t) 从而可以得到系统的状态轨迹 x(t),使得目标函数最优。对于轨迹跟踪问题,那目标函数就是使得这个轨迹在一定的时间范围[t0tf]内与我们期望的轨迹(目标)x*(t) 越近

    2024年02月04日
    浏览(36)
  • .NET使用依赖注入,控制反转

    .NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。 不在服务

    2023年04月16日
    浏览(35)
  • K8S访问控制------认证(authentication )、授权(authorization )、准入控制(admission control )体系

    在K8S体系中有两种账号类型:User accounts(用户账号),即针对human user的;Service accounts(服务账号),即针对pod的。这两种账号都可以访问 API server,都需要经历认证、授权、准入控制等步骤,相关逻辑图如下所示: 在K8S架构中,可以使用多种认证方式,比如:X509 Client Cer

    2024年02月11日
    浏览(26)
  • Go中的控制反转 IoC

    控制反转 是一种解耦思想,将原本耦合在 业务逻辑 中的 控制逻辑 单独拆出来实现,不再让 业务逻辑 在处理业务的同时还要去实现 控制逻辑 ,而是专注处理业务。在 业务逻辑 代码中耦合进 控制逻辑 ,会导致在编写业务逻辑时需要处理业务之外的事,而且 控制逻辑 耦合

    2024年03月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包