目录
总结
首页 web前端 js教程 聊聊node框架 Nest.js怎么松耦合地整合 Express !

聊聊node框架 Nest.js怎么松耦合地整合 Express !

Mar 02, 2022 pm 07:54 PM
express node

本篇文章带大家聊聊node框架 Nest.js是如何松耦合地整合 Express 的,希望对大家有所帮助!

聊聊node框架 Nest.js怎么松耦合地整合 Express !

Nodejs 提供了 http 模块用于监听端口、处理 http 请求,返回响应,这也是它主要做的事情。

但是 http 模块的 api 太过原始,直接基于它来处理请求响应比较麻烦,所以我们会用 express 等库封装一层。

这一层做的事情就是给 request 和 response 添加了很多处理请求响应的方法,满足各种场景的需求,并且对路由做了处理,而且,也提供了中间件的调用链便于复用一些代码,这种中间件的调用链叫做洋葱模型。

1.png

但这一层没有解决架构问题:当模块多了怎么办,怎么管理?如何划分 Model、View、Controller? 等等。

所以,用 Node.js 做后端服务时我们会再包一层,解决架构问题,这一层的框架有 eggjs(蚂蚁的)、midwayjs(淘宝的)、nestjs(国外的)。

nestjs 是其中最优秀的一个:

2.png

3.png

4.png

这一层的底层还是 express、koa 等,它只是在那些 http 框架的基础上额外解决了架构问题。

而且 nestjs 还有一点做的特别好,它不依赖任何一个 http 平台,可以灵活的切换。

那么 nestjs 是怎么做到底层平台的切换的呢?

想想 react 是怎么做到把 vdom 渲染到 canvas、dom、native 的?

定义一层统一的接口,各种平台的 render 逻辑实现这些接口。这种模式叫做适配器模式。

适配器模式是当用到第三方实现的某个功能时,不直接依赖,而是定义一层接口,让第三方去适配这层接口。这样任何一个适配了这层接口的方案都能集成,也能够灵活的切换方案。

Nest.js 对底层的 http 平台就是提供了一层接口(HttpServer),定义了一堆用到的方法:

5.png

因为 ts 的 interface 必须实现所有的方法才行,为了简化,又继承了一层抽象类 AbstractHttpAdapter,把需要实现的方法定义成 abstract 的。

6.png

然后 express 或者别的平台比如 fastify 只要继承这个适配器的类,实现其中的抽象方法,就能接入到 Nest.js 里:

比如 ExpressAdapter:

7.png

或者 FastifyAdapter:

8.png

这些逻辑分别放在 platform-express 和 platform-fastify 包里:

9.png

Nest.js 第一行代码是调用 create:

10.png

create 里就会选择一种 httpAdapter 来创建服务:

11.png

默认是 express:

12.png

这样,之后调用的 request 和 response 的方法最终就都是 express 的了。

比如在 controller 里可以用 @Request 装饰器来注入 reqeust 对象,就可以调用 reqeust 的各种方法。

import { Controller, Get, Request } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@@Request() request: Request): string {
    return 'This action returns all cats';
  }
}
登录后复制

如果你想调用一些接口之外的特定平台的方法的话,Nest.js 也支持,那就换用 @Req 来注入:

import { Controller, Get, Req } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@@Req() request: Request): string {
    return 'This action returns all cats';
  }
}
登录后复制

这样注入的就是特定平台比如 express 的原生 request 对象,就可以直接用它的所有方法。

此外,如果真的要用 Express 平台的特定 api 的话,在 NestFactory.create 的时候可以指定对应的类型参数,这样就能做相应的类型提示和检查了:

13.png

但是这样就和特定平台耦合了,除非是确定不会切换平台,否则不建议这么做。

http 平台是这么做的,同理,websocket 平台也是这样的:

定义了一层统一的接口,通过适配器的方式分别接入 socketio 和 websocket,可以灵活的切换:

14.png

图解下 Nest.js 关于 http 、websocket 平台的处理:

15.png

总结

Node.js 提供了 http 模块用来监听端口、处理请求响应,但是它的 api 过于原始,所以我们会包一层,在 express 这一层提供更多好用的 request、response 的 api,但这层没解决架构问题,要引入 MVC、IOC 等架构,需要再包一层,用 Egg.js、Midway.js、Nest.js 这种更上层的后端框架,其中 Nest.js 是最优秀的。

Nest.js 在和底层 http 平台的整合上做了特殊的设计,利用适配器模式,提供一层接口,让底层平台去适配,这样就可以灵活的切换不同的 http 平台了。

但它也同样支持用特定平台的 api,比如 controller 里可以用 @Req 注入底层的 request 对象,创建容器的时候也可以传入对应平台的类型参数。

Nest.js 默认使用的是 Express,但说用了 Express 也不完全对,因为可以灵活的切换别的。这就是适配器模式的魅力。

更多node相关知识,请访问:nodejs 教程

以上是聊聊node框架 Nest.js怎么松耦合地整合 Express !的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

nvm 怎么删除node nvm 怎么删除node Dec 29, 2022 am 10:07 AM

nvm删除node的方法:1、下载“nvm-setup.zip”并将其安装在C盘;2、配置环境变量,并通过“nvm -v”命令查看版本号;3、使用“nvm install”命令安装node;4、通过“nvm uninstall”命令删除已安装的node即可。

node项目中如何使用express来处理文件的上传 node项目中如何使用express来处理文件的上传 Mar 28, 2023 pm 07:28 PM

怎么处理文件上传?下面本篇文章给大家介绍一下node项目中如何使用express来处理文件的上传,希望对大家有所帮助!

深入浅析Node的进程管理工具“pm2” 深入浅析Node的进程管理工具“pm2” Apr 03, 2023 pm 06:02 PM

本篇文章给大家分享Node的进程管理工具“pm2”,聊聊为什么需要pm2、安装和使用pm2的方法,希望对大家有所帮助!

Pi Node教学:什么是Pi节点?如何安装和设定Pi Node? Pi Node教学:什么是Pi节点?如何安装和设定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork节点详解及安装指南本文将详细介绍PiNetwork生态系统中的关键角色——Pi节点,并提供安装和配置的完整步骤。Pi节点在PiNetwork区块链测试网推出后,成为众多先锋积极参与测试的重要环节,为即将到来的主网发布做准备。如果您还不了解PiNetwork,请参考Pi币是什么?上市价格多少?Pi用途、挖矿及安全性分析。什么是PiNetwork?PiNetwork项目始于2019年,拥有其专属加密货币Pi币。该项目旨在创建一个人人可参与

聊聊用pkg将Node.js项目打包为可执行文件的方法 聊聊用pkg将Node.js项目打包为可执行文件的方法 Dec 02, 2022 pm 09:06 PM

​如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node项目打包为可执行文件的方法,希望对大家有所帮助!

npm node gyp失败怎么办 npm node gyp失败怎么办 Dec 29, 2022 pm 02:42 PM

npm node gyp失败是因为“node-gyp.js”跟“Node.js”版本不匹配,其解决办法:1、通过“npm cache clean -f”清除node缓存;2、通过“npm install -g n”安装n模块;3、通过“n v12.21.0”命令安装“node v12.21.0”版本即可。

使用Angular和Node进行基于令牌的身份验证 使用Angular和Node进行基于令牌的身份验证 Sep 01, 2023 pm 02:01 PM

身份验证是任何Web应用程序中最重要的部分之一。本教程讨论基于令牌的身份验证系统以及它们与传统登录系统的区别。在本教程结束时,您将看到一个用Angular和Node.js编写的完整工作演示。传统身份验证系统在继续基于令牌的身份验证系统之前,让我们先看一下传统的身份验证系统。用户在登录表单中提供用户名和密码,然后点击登录。发出请求后,通过查询数据库在后端验证用户。如果请求有效,则使用从数据库中获取的用户信息创建会话,然后在响应头中返回会话信息,以便将会话ID存储在浏览器中。提供用于访问应用程序中受

什么是单点登录系统?用nodejs怎么实现? 什么是单点登录系统?用nodejs怎么实现? Feb 24, 2023 pm 07:33 PM

什么是单点登录系统?用nodejs怎么实现?下面本篇文章给大家介绍一下使用node实现单点登录系统的方法,希望对大家有所帮助!

See all articles