深入浅析Nodejs中的“洋葱模型”

本篇文章带大家了解一下nodejs中的“洋葱模型”。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

深入浅析Nodejs中的“洋葱模型”

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

推荐学习:《nodejs》

1. 洋葱模型

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

1.png

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

2. 洋葱模型与Node的关系

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

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

从外向内的过程是一个关键词 next();而从内向外则是每个中间件执行完毕后,进入原来的上一层中间件,一直到最外一层。

3. 中间件的执行

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

2.png3.png

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 的方式:

/** * 中间件 1 */app.use(async (req, res, next) => {    console.log('first');    await next();    console.log('first end');});

登录后复制

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

4.png

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

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

const Koa = require('koa');const app = new Koa();/** * 中间件 1 */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');});

登录后复制

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

5.png

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

更多编程相关知识,请访问:nodejs!!

以上就是深入浅析Nodejs中的“洋葱模型”的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2634381.html

(0)
上一篇 2025年3月7日 04:32:15
下一篇 2025年2月19日 07:57:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 浅谈Nodejs中的callback回调

    本篇文章给大家介绍一下nodejs中的callback回调。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 推荐学习:《nodejs》 什么是callback?  很显然,字面意思就是回调 那为什么在Node中需要回调操作…

    2025年3月7日
    200
  • Nodejs如何实现简单的GET请求

    本篇文章给大家介绍一下node.js实现简单的get请求的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 【推荐学习:《nodejs 教程》】 GET请求的识别非常的简单,就是URL的识别,使用的是url.parse…

    2025年3月7日 编程技术
    200
  • 聊聊Nodejs中的模块化和事件循环

    本篇文章带大家了解一下nodejs中的模块化和事件循环。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 5.20出了一款线上Ide,能够在浏览器上边运行 Node.js —nodejs 1 Node.js简介 Node.j…

    2025年3月7日 编程技术
    200
  • 深入浅析Node.js中的异步

    本篇文章给大家详细介绍一下node.js中的异步。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 关于 Node.js 异步,绕不开两点:非阻塞 I/O 和事件循环。也正是因为这两点,Node.js 才能被称为高性能并运用…

    2025年3月7日
    200
  • 浅谈Nodejs中的模块规范

    本篇文章给大家详细了解一下nodejs中的模块规范。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 模块规范是构建一个大型 Node.js 应用的基础,所以非常重要;Node.js 模块规范也就是 CommonJS 模块规…

    2025年3月7日 编程技术
    200
  • 浅谈使用Node.js搭建一个简单的 HTTP 服务器

    本篇文章给大家使用node.js搭建一个简单的 http 服务器来试着操纵计算机资源。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 什么是 HTTP 服务? HTTP 协议是什么? 超文本传输协议,一个应用层协议,一个在…

    2025年3月7日 编程技术
    200
  • 深入了解Node.js中的Koa框架

    本篇文章给大家详细介绍一下node.js中的koa框架。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 在前文已经简单的了解了 Express 框架,并且使用该框架对石头剪刀布游戏进行了改造,那么来看看 Koa 框架和 E…

    2025年3月7日
    200
  • 浅谈Nodejs中的可读流,可读流如何实现?

    本篇文章给大家介绍一下nodejs中的流(stream),看看node可读流的实现方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 stream的概念 流(stream)是 Node.js 中处理流式数据的抽象接口。 …

    2025年3月7日 编程技术
    200
  • 深入了解Node.js的中Worker Threads(工作线程)

    【推荐学习:《nodejs 教程》】 理解 Node 的底层对于理解 Workers 是很有必要的。 当一个 Node.js 的应用启动的同时,它会启动如下模块: 一个进程一个线程事件循环机制JS 引擎实例Node.js 实例 一个进程:p…

    2025年3月7日
    200
  • 深入浅析Node.js中的内置模块

    本篇文章带大家了解一下node.js中的内置模块,看看node.js内置模块运行机制,通过示例简单介绍一下eventemitter (观察者模式)。 Node.js 架构图 内置模块 一些栗子 File System 操作文件的 APIPr…

    2025年3月7日
    200

发表回复

登录后才能评论