nestjs之适配器模式的应用

NestJS 是一个用于构建高效、可靠和可扩展的服务器端应用程序的框架。在 NestJS 中,适配器模式(Adapter Pattern)主要体现在其对不同类型的 HTTP 服务端框架的适配上。NestJS 本身是建立在 Express 或者 Fastify 这样的底层 HTTP 框架之上的,但它提供了一个抽象层,使得开发者可以不必关心底层框架的具体实现。

适配器模式是一种结构型设计模式,它允许对象以兼容的方式协同工作,即便它们的接口不兼容。在 NestJS 中,这意味着你可以在不改变应用程序核心逻辑的情况下,切换不同的 HTTP 框架。

如何工作的?

  1. 抽象层:NestJS 定义了一组抽象的 HTTP 接口,这些接口描述了处理 HTTP 请求所需的基本操作,如处理请求、响应等。
// @nestjs\core\adapters\http-adapter.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractHttpAdapter = void 0;
/*** @publicApi*/
class AbstractHttpAdapter {constructor(instance) {this.instance = instance;}// eslint-disable-next-line @typescript-eslint/no-empty-functionasync init() { }use(...args) {return this.instance.use(...args);}get(...args) {return this.instance.get(...args);}post(...args) {return this.instance.post(...args);}head(...args) {return this.instance.head(...args);}delete(...args) {return this.instance.delete(...args);}put(...args) {return this.instance.put(...args);}patch(...args) {return this.instance.patch(...args);}all(...args) {return this.instance.all(...args);}search(port, hostname, callback) {return this.instance.search(port, hostname, callback);}options(...args) {return this.instance.options(...args);}listen(port, hostname, callback) {return this.instance.listen(port, hostname, callback);}getHttpServer() {return this.httpServer;}setHttpServer(httpServer) {this.httpServer = httpServer;}setInstance(instance) {this.instance = instance;}getInstance() {return this.instance;}
}
exports.AbstractHttpAdapter = AbstractHttpAdapter;
  1. 适配器:对于每种支持的底层 HTTP 框架(如 Express 或 Fastify),NestJS 提供了一个适配器。这个适配器实现了 NestJS 定义的 HTTP 抽象接口,但在内部使用特定框架的方法。
// @nestjs\platform-express\adapters\express-adapter.js
const http_adapter_1 = require("@nestjs/core/adapters/http-adapter");
class ExpressAdapter extends http_adapter_1.AbstractHttpAdapter {...
}
exports.ExpressAdapter = ExpressAdapter;

FastifyAdapter 的实现。

// @nestjs\platform-fastify\adapters\fastify-adapter.js
const http_adapter_1 = require("@nestjs/core/adapters/http-adapter");
class FastifyAdapter extends http_adapter_1.AbstractHttpAdapter {...
}
exports.FastifyAdapter = FastifyAdapter;
  1. 灵活切换:因为 NestJS 应用程序是针对这些抽象接口编写的,所以可以通过简单地更换适配器来切换底层的 HTTP 框架,而不需要重写应用逻辑。
    执行await NestFactory.create(AppModule)的时候,会判断serverOrOptions传进去是不是一个Adapter
class NestFactoryStatic {constructor() {this.logger = new logger_service_1.Logger('NestFactory', {timestamp: true,});this.abortOnError = true;this.autoFlushLogs = false;}async create(moduleCls, serverOrOptions, options) {const [httpServer, appOptions] = this.isHttpServer(serverOrOptions)? [serverOrOptions, options]: [this.createHttpAdapter(), serverOrOptions];...}}

示例

例如,如果你想将你的 NestJS 应用从 Express 切换到 Fastify,你只需要更换相应的适配器。在 NestJS 中,这通常通过更改 main.ts 文件中的一行代码来完成:

const app = await NestFactory.create(AppModule, new FastifyAdapter());

相比之下,如果使用 Express 适配器,代码将会是:

const app = await NestFactory.create(AppModule); // 默认是 ExpressAdapter

expressFastify都实现了AbstractHttpAdapter方法,于是无论用户传入哪一种都可以实现http模块的解耦。

优势

  • 灵活性:允许开发者根据项目需求或个人偏好选择合适的 HTTP 框架。
  • 解耦:应用核心逻辑与底层 HTTP 框架解耦,提高了代码的可维护性。
  • 易于测试:由于底层框架被抽象化,使得对应用逻辑的单元测试更加容易。

总之,适配器模式在 NestJS 中的应用提供了一种优雅的方式来支持不同的 HTTP 框架,同时保持应用核心逻辑的一致性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openssl3.2/test/certs - 033 - time stamping certificates

文章目录 openssl3.2/test/certs - 033 - time stamping certificates概述笔记END openssl3.2/test/certs - 033 - time stamping certificates 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! \file my_openssl_linux_log_doc_033.txt\note openssl3.2/test/ce…

《解释与话语权》——西游真假美猴王是自导自演吗

解读与话语权 引言 一旦有人或者组织垄断了话语权,那么什么都可以被重新定义和解读,本篇旨在让读者有更多视角的思考。 为什么一个耶和华能分裂成天主教,东正教,新教等,都是对于圣经和圣经故事的不同解读。 红学那…

解析GPT-3、GPT-4和ChatGPT关系-迈向自然语言处理的新高度“

Hello,小索奇!很高兴为你拓展关于GPT-3、GPT-4、ChatGPT之间关系的信息,以及解释自然语言模型和Transformer的区别。 首先,GPT-3、GPT-4、ChatGPT都是建立在GPT系列技术基础上的自然语言处理模型。它们在不同的代数、性能和应用场…

k8s的图形化工具---rancher

rancher是一个开源的企业级多集群的k8s管理平台。 rancher和k8s的区别:都是为了容器的调度和编排系统。但是rancher不仅可以调度还可以管理整个k8s集群。 rancher自带监控(普罗米修斯) 实验部署 master01 20.0.0.32 node01 20.0.0.34 node02 20.0.0.35 test …

linux系统mysql8单机多实例+主从复制部署

一、解压mysql压缩包 参考我的另一篇博文,tag.gz解压完并且配置完环境变量即可,暂时不要初始化 linux单机部署mysql(离线环境解压即可)-CSDN博客 二、修改配置文件 可能因为版本不同,我的这个配置可能不是通用的,我安装的是my…

【Java Kubernates】Java调用kubernates提交Yaml到SparkOperator

背景 目前查询框架使用的是trino,但是trino也有其局限性,需要准备一个备用的查询框架。考虑使用spark,spark operator也已经部署到k8s,现在需要定向提交spark sql到k8s的sparkoperator上,使用k8s资源执行sql。 对比 …

linux安装docker--更具官网教程

1.访问https://docs.docker.com/ 2.进入download 3输入cento 或者直接访问地址Install Docker Engine on CentOS | Docker Docs 4一步一步根据官网命令走 2安装 3 4 方式一: service docker start(开启) service docker status&#xff08…

ubuntu怎么安装docker

sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release 添加Docker官方的GPG密钥 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -使用以下命令设置稳定存储库。要添加 夜间或测试存储库&…

使用PowerShell命令行,批量修改文件编码

目录 ■前言 ■PowerShell命令 ■效果 ■前言 今天统计修改代码量,使用工具时,发现有些代码无法统计。 原因时UTF-8中有某些特殊字符,工具不能识别。 但是,如果把代码转换为SJIS格式,就能正常统计了。 因此&…

听筒及麦克风电路时序分析

打电话的时候。当没有免提的时候,用的是mic1,麦克风1居然是在J7尾插座子上,所以要把手机的下面贴近嘴巴。mic1的信号给到音频编解码u21,u21通过i2s线给cpu, 然后给基带cpu,然后通过射频发射出去。当要听声音的时候,射频…

【数学建模】插值与拟合

文章目录 插值插值方法用Python解决插值问题 拟合最小二乘拟合数据拟合的Python实现 适用情况 处理由试验、测量得到的大量数据或一些过于复杂而不便于计算的函数表达式时,构造一个简单函数作为要考察数据或复杂函数的近似 定义 给定一组数据,需要确定满…

【软件测试】学习笔记-性能测试场景的分类

性能测试场景的重要程度类似于业务测试的 case,case 是你进行业务测试的指引,case 是否完善也直接决定了测试的覆盖率。同理,场景是传递执行性能测试的步骤和目的,关于这两点是你一定要清楚的。 首先认识下最重要的三个性能场景&…

自主涉及从事实中抽取价值的能力

自主包括从事实中抽取价值的能力是指个体或组织在面对大量事实信息时,能够自主选择并提取出其中具有价值的内容或信息的能力。这种能力要求个体或组织具备以下几个方面的能力和素质: 1、分析能力 能够识别和理解大量的事实信息,并对其进行分析…

2024上海国际大数据与存储技术设备展览会

2024上海国际大数据与存储技术设备展览会 时间:2024年11月18-20日 地点:上海新国际博览中心 承办单位:中电会展与信息传播有限公司、上海蒙均展览服务有限公司 展会背景: 大数据时代来临,各行业数据规模呈TB级增长&#xff0…

Golang内存逃逸引发的面试考察点

Golang内存逃逸引发的面试考察点 什么是内存逃逸? 在go语言中每个goroutine都会有一个自己的栈区,每个栈区呢又会对应多个栈帧,每个栈帧就会对应一个函数,这个栈帧就是用来存储函数的局部变量、入参、返回地址等等。这些变量就会…

MySQL中GTID在主从复制机制中的作用

在数据库的世界里,数据的一致性和高可用性是任何大型应用都必须考虑的问题。尤其对于那些依赖数据库做主要存储的系统来说,如何保障数据库服务在面对故障时依然能稳定运行并保证数据不丢失,是每个数据库管理员(DBA)需要…

Java项目:12 Springboot的垃圾回收管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 1.介绍 垃圾分类查询管理系统,对不懂的垃圾进行查询进行分类并可以预约上门回收垃圾。 让用户自己分类垃圾, 按国家标准自己分类&#x…

解读IP风险画像标签:深度洞察网络安全

在当今数字化的世界中,网络安全成为企业和个人关注的焦点。IP风险画像标签作为网络安全的利器,扮演着深度洞察网络风险的角色。本文将深入解读IP风险画像标签,揭示其在网络安全领域的重要性和功能。 1. IP风险画像标签是什么? I…

Jmeter-解析返回参数-解析并操作json

工作中经常会遇到JSON字符串,接口的入参和返回参数也多数是JSON格式,自动化项目中常需要写脚本处理返回结果,本文总结java或jmeter的beanshell脚本中对于json的常用操作 json字符串的格式 简单的JSON字符串:{“key”:“value”,“…

【服务器数据恢复】EqualLogic存储磁盘坏道导致存储不可用的数据恢复案例

服务器数据恢复环境&故障: 某公司IT部门一台某品牌EqualLogic PS6100系列存储在运行过程中突然崩溃。 服务器管理员对故障服务器存储进行初步检查,经过检测发现导致该服务器存储无法正常工作的原因是该存储中raid5磁盘阵列内有2块硬盘出现故障离线&a…