目錄
1. 洋蔥模型
2. 洋蔥模型與Node的關係
3. 中間件的執行
首頁 web前端 js教程 深入淺析Nodejs中的'洋蔥模型”

深入淺析Nodejs中的'洋蔥模型”

May 07, 2021 am 10:29 AM
nodejs

本篇文章帶大家了解一下Nodejs中的「洋蔥模型」。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

深入淺析Nodejs中的'洋蔥模型”

目前比較流行的Node.js 框架有Express、KOA和Egg.js,其次是另一個正在興起的與TypeScript 相關的框架-Nest.js,無論是哪個Node.js 框架,都是基於中間件來實現的,而中間件(可以理解為一個類別或函數模組)的執行方式就需要依據洋蔥模型

推薦學習:《nodejs 教程

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

/**
 * 中间件 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();
/**
 * 中间件 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');
});
登入後複製
重新運行,最終輸出結果為:

深入淺析Nodejs中的洋蔥模型”#你會發現,KOA 嚴格按照了洋蔥模型的執行,從上到下,也就是從洋蔥的內部向外部,輸出first、second、async、third;接下來從內向外輸出third end、async end、second end、first end。

更多程式相關知識,請造訪:

程式設計教學

! !

以上是深入淺析Nodejs中的'洋蔥模型”的詳細內容。更多資訊請關注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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs和vuejs區別 nodejs和vuejs區別 Apr 21, 2024 am 04:17 AM

Node.js 是一種伺服器端 JavaScript 執行時,而 Vue.js 是一個客戶端 JavaScript 框架,用於建立互動式使用者介面。 Node.js 用於伺服器端開發,如後端服務 API 開發和資料處理,而 Vue.js 用於用戶端開發,如單一頁面應用程式和響應式使用者介面。

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs可以寫前端嗎 nodejs可以寫前端嗎 Apr 21, 2024 am 05:00 AM

是的,Node.js可用於前端開發,主要優勢包括高效能、豐富的生態系統和跨平台相容性。需要考慮的注意事項有學習曲線、工具支援和社群規模較小。

See all articles