首頁 > 軟體

Node.js 網路框架koa compose中介軟體使用解析

2022-12-27 14:01:35

前言

學習目標:

  • koa-compose
  • 洋蔥模型

原始碼地址:koajs/compose

koa-compose

Koa-compose 是一個 Koa 中介軟體工具,Koa 是一個流行的 Node.js 網路框架。Koa-compose 允許你將多箇中介軟體函陣列合成一個單獨的函數,這樣可以更容易地管理和重用中介軟體。

在 Koa 中,中介軟體函數是按照特定順序呼叫的函數,用於處理傳入的 HTTP 請求並生成響應。中介軟體函數可以執行各種任務,例如解析請求主體、驗證請求引數或與資料庫互動。

中介軟體的簡單範例:

// sendHandle.js
const sendHandle = () => {
    // 處理請求成功方法
    const render = ctx => {
        return (data, msg = '請求成功') => {
            ctx.set('Content-Type', 'application/json');
            ctx.body = {
                code: '000001',
                data,
                msg
            }
        }
    }
    // 處理請求失敗方法
    const renderError = ctx => {
        return (code, msg = '請求失敗') => {
            ctx.set('Content-Type', 'application/json');
            ctx.body = {
                code,
                data: null,
                msg
            }
        }
    }
    return async (ctx, next) => {
        ctx.send = render(ctx);
        ctx.sendError = renderError(ctx);
        await next();
    }
}
module.exports = sendHandle;

然後在app.js 中參照,如圖

上面中介軟體的作用是處理請求的結果。

詳細程式碼可以參考,codeniu/niu-box ,這是一個 koa 小專案。

洋蔥模型

洋蔥模型是一種用於解釋中介軟體的架構模型。它描述了中介軟體的工作方式,以及中介軟體如何在處理請求和生成響應時與其他中介軟體協同工作。

在洋蔥模型中,中介軟體被描述為一個可以包裝在外層的函數。每個中介軟體函數都可以在接收到請求時執行一些操作,然後將請求傳遞給內層的中介軟體函數。當內層的中介軟體函數完成工作並返回響應時,外層的中介軟體函數可以再次執行一些操作,然後將響應返回給使用者端。

原始碼解析

'use strict'
/**
 * Expose compositor.
 */
module.exports = compose
/**
 * Compose `middleware` returning
 * a fully valid middleware comprised
 * of all those which are passed.
 *
 * @param {Array} middleware
 * @return {Function}
 * @api public
 */
function compose (middleware) {
  if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')
  for (const fn of middleware) {
    if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
  }
  /**
   * @param {Object} context
   * @return {Promise}
   * @api public
   */
  return function (context, next) {
    // last called middleware #
    let index = -1
    return dispatch(0)
    function dispatch (i) {
      if (i <= index) return Promise.reject(new Error('next() called multiple times'))
      index = i
      let fn = middleware[i]
      if (i === middleware.length) fn = next
      if (!fn) return Promise.resolve()
      try {
        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)))
      } catch (err) {
        return Promise.reject(err)
      }
    }
  }
}

compose() 函數的引數是一箇中介軟體陣列,它包含了要組合的中介軟體函數。首先,程式碼會檢查中介軟體陣列是否是一個陣列,並檢查陣列中的每個元素是否都是函數。如果中介軟體陣列不合法,就會丟擲一個錯誤。

然後,compose() 函數會返回一個新的函數,該函數接受兩個引數:contextnextcontext 物件包含了請求的上下文資訊,例如請求路徑、請求引數等。next 函數是一個回撥函數,用於在當前中介軟體函數完成工作後呼叫下一個中介軟體函數。

變數 index,用於記錄最後一個被呼叫的中介軟體函數的編號。

在每次呼叫中介軟體函數之前,都會檢查當前中介軟體函數的編號是否小於等於 index 變數。如果是,就意味著 next() 函數被呼叫了多次,會返回一個錯誤。然後會更新 index 變數,並獲取下一個中介軟體函數。

如果當前中介軟體函數是最後一箇中介軟體函數,就會將 next 函數賦值給當前中介軟體函數。如果沒有更多的中介軟體函數,就會返回一個已完成的 Promise 物件。

最後,呼叫當前中介軟體函數,並返回一個 Promise 物件。如果在呼叫過程中發生錯誤則會丟擲一個異常。

總結

koa-compose 使用遞迴和Promise來實現多箇中介軟體的鏈式呼叫,Promise 很好的簡化了非同步流程,並且能夠讓你使用 try-catch 語句捕獲非同步錯誤。

以上就是Node.js 網路框架koa compose中介軟體使用解析的詳細內容,更多關於Node.js框架koa compose中介軟體的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com