返回顶部
首页 > 资讯 > 精选 >Nodejs中的“洋葱模型
  • 288
分享到

Nodejs中的“洋葱模型

2023-06-14 23:06:19 288人浏览 薄情痞子
摘要

小编给大家分享一下nodejs中的“洋葱模型,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!目前比较流行的 node.js 框架有Express、KOA和Egg.j

小编给大家分享一下nodejs中的“洋葱模型,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

目前比较流行的 node.js 框架有Express、KOA和Egg.js,其次是另外一个正在兴起的与 typescript 相关的框架——Nest.js,无论是哪个 node.js 框架,都是基于中间件来实现的,而中间件(可以理解为一个类或者函数模块)的执行方式就需要依据洋葱模型

1. 洋葱模型

洋葱我们都知道,一层包裹着一层,层层递进,但是现在不是看其立体的结构,而是需要将洋葱切开来,从切开的平面来看,如图 所示:

Nodejs中的“洋葱模型

可以看到要从洋葱中心点穿过去,就必须先一层层向内穿入洋葱表皮进入中心点,然后再从中心点一层层向外穿出表皮,这里有个特点:进入时穿入了多少层表皮,出去时就必须穿出多少层表皮。先穿入表皮,后穿出表皮,符合我们所说的栈列表,先进后出的原则。

2. 洋葱模型与Node的关系

目前比较流行的 Node.js 框架有Express、KOA 和 Egg.js,无论是哪个 Node.js 框架,都是基于中间件来实现的,而中间件(可以理解为一个类或者函数模块)的执行方式就需要依据洋葱模型

洋葱的表皮我们可以思考为中间件:

从外向内的过程是一个关键词 next();

而从内向外则是每个中间件执行完毕后,进入原来的上一层中间件,一直到最外一层。

3. 中间件的执行

以express为例,以下就是中间件的一个基本执行过程:

Nodejs中的“洋葱模型Nodejs中的“洋葱模型

Koa是基于Express的同一班人马开发的下一代node框架,二者的主要区别:

  • Express 封装、内置了很多中间件,比如 connect 和 router ,而 KOA 则比较轻量,开发者可以根据自身需求定制框架;

  • Express 是基于 callback 来处理中间件的,而 KOA 则是基于 await/async;

  • 在异步执行中间件时,Express 并非严格按照洋葱模型执行中间件,而 KOA 则是严格遵循的(体现再两者在中间件为异步函数的时候处理会有不同)。

Express 和 KOA 之间关于洋葱模型的执行方式的区别介绍

我们保留上述示例代码的原来三个中间件,同时在 2 和 3 之间插入一个新的异步中间件,代码如下:

(1)express

app.use(async (req, res, next) => {    console.log('async');    await next();    await new Promise(        (resolve) =>             setTimeout(                () => {                    console.log(`wait 1000 ms end`);                    resolve()                },             1000        )    );    console.log('async end');});

然后将其他中间件修改为 await next() 方式,如下中间件 1 的方式:

app.use(async (req, res, next) => {    console.log('first');    await next();    console.log('first end');});

重新运行,最终输出结果为:

Nodejs中的“洋葱模型

可以看出,从外向内的是正常的,一层层往里进行调用,从内向外时则发生了一些变化,最主要的原因是异步中间件并没有按照顺序输出执行结果

(2)Koa保持上面的代码顺序,只将对应的express语法改成koa语法,其中中间件1和异步中间件代码部分如下示例:

const Koa = require('koa');const app = new Koa();app.use(async (ctx, next) => {    console.log('first');    await next();    console.log('first end');});app.use(async (ctx, next) => {    console.log('async');    await next();    await new Promise(        (resolve) =>             setTimeout(                () => {                    console.log(`wait 1000 ms end`);                    resolve()                },             1000        )    );    console.log('async end');});

重新运行,最终输出结果为:

Nodejs中的“洋葱模型

你会发现,KOA 严格按照了洋葱模型的执行,从上到下,也就是从洋葱的内部向外部,输出 first、second、async、third;接下来从内向外输出 third end、async end、second end、first end。

以上是“Nodejs中的“洋葱模型”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Nodejs中的“洋葱模型

本文链接: https://lsjlt.com/news/275820.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Nodejs中的“洋葱模型
    小编给大家分享一下Nodejs中的“洋葱模型,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!目前比较流行的 Node.js 框架有Express、KOA和Egg.j...
    99+
    2023-06-14
  • 怎么更好地理解中间件和洋葱模型
    这篇文章主要介绍“怎么更好地理解中间件和洋葱模型”,在日常操作中,相信很多人在怎么更好地理解中间件和洋葱模型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么更好地理解中间件和洋葱模型”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • JavaScript 设计模式之洋葱模型原理及实践应用
    目录前言洋葱模型实践总结前言 先来听听一个故事吧,今天产品提了一个业务需求:用户在一个编辑页面,此时用户点击退出登录,应用需要提示用户当前有编辑内容未保存,是否保存;当用户操作完毕后...
    99+
    2024-04-02
  • 20行代码简单实现koa洋葱圈模型示例详解
    目录引言koa中间件的使用洋葱圈模型洋葱圈模型的实现,koa-compose单次调用限制koa-compose与流程引擎总结引言 koa想必很多人直接或间接的都用过,其源码不知道阅...
    99+
    2023-01-17
    koa洋葱圈模型 koa洋葱模型
  • 驾驭 JavaScript BOM 的航海图:探索浏览器对象模型的海洋
    浏览器对象模型:BOM 的定义 浏览器对象模型(BOM)是一组 JavaScript 对象,这些对象提供了对浏览器功能和环境的访问,例如窗口、文档和导航栏。BOM 允许开发人员与浏览器进行交互,控制页面布局、获取用户输入、管理历史记录等...
    99+
    2024-03-05
    JavaScript BOM、浏览器对象模型、window、document、location、navigator
  • NodeJs中的VM模块详解
    什么是VM? VM模块是NodeJS里面的核心模块,支撑了require方法和NodeJS的运行机制,我们有些时候可能也要用到VM模板来做一些特殊的事情。 通过VM,JS可以被编译后立即执行或者编译保存下来...
    99+
    2022-06-04
    详解 模块 NodeJs
  • Nodejs中crypto模块的用法
    这篇文章主要介绍“Nodejs中crypto模块的用法”,在日常操作中,相信很多人在Nodejs中crypto模块的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node...
    99+
    2024-04-02
  • nodejs中的http模块与npm模块使用
    目录http模块创建服务器基本步骤request对象详解response对象详解实现静态WEB服务器服务器响应首页根据根据不同url,响应不同文件静态资源的通用处理npm - Nod...
    99+
    2022-11-13
    nodejs中http模块 nodejs中npm模块 http模块与npm模块使用
  • NodeJS中的模块是单例吗
    本篇内容介绍了“NodeJS中的模块是单例吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!NodeJS的模...
    99+
    2024-04-02
  • Nodejs中的net模块怎么用
    这篇文章主要介绍了Nodejs中的net模块怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Nodejs中的net模块怎么用文章都会有所收获,下面我们一起来看看吧。1. O...
    99+
    2024-04-02
  • NodeJS中Buffer模块详解
    一,开篇分析 所谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存。 JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局...
    99+
    2022-06-04
    详解 模块 NodeJS
  • nodejs中模块化指的是什么
    这篇“nodejs中模块化指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node...
    99+
    2024-04-02
  • Nodejs中的buffer模块怎么使用
    这篇文章主要介绍“Nodejs中的buffer模块怎么使用”,在日常操作中,相信很多人在Nodejs中的buffer模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Nodejs中有哪些Buffer模块的API
    这篇文章给大家介绍Nodejs中有哪些Buffer模块的API,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。模块概览Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写、网络请求数据的处...
    99+
    2023-06-15
  • Nodejs中的http模块怎么使用
    这篇文章主要介绍了Nodejs中的http模块怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Nodejs中的http模块怎么使用文章都会有所收获,下面我们一起来看看吧。一、http 模块http 模块是...
    99+
    2023-07-04
  • nodejs中events模块怎么办
    这篇文章将为大家详细讲解有关nodejs中events模块怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如...
    99+
    2023-06-06
  • NodeJS Express如何使用ORM模型访问关系型数据库
    这篇文章主要介绍了NodeJS Express如何使用ORM模型访问关系型数据库的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇NodeJS Express如何使用ORM模型访问关系型数据库文...
    99+
    2023-07-05
  • nodejs中模块定义的示例分析
    这篇文章将为大家详细讲解有关nodejs中模块定义的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:1.模块定义nodejs所谓的模块就是一个文件!一个....
    99+
    2024-04-02
  • Nodejs中Buffer模块的用法是什么
    这篇文章主要介绍“Nodejs中Buffer模块的用法是什么”,在日常操作中,相信很多人在Nodejs中Buffer模块的用法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • Nodejs中cluster模块的作用是什么
    这期内容当中小编将会给大家带来有关Nodejs中cluster模块的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。code1const cluster...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作