溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Node.js網(wǎng)絡(luò)框架koa?compose中間件如何使用

發(fā)布時間:2022-12-27 16:50:33 來源:億速云 閱讀:133 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Node.js網(wǎng)絡(luò)框架koa compose中間件如何使用的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Node.js網(wǎng)絡(luò)框架koa compose中間件如何使用文章都會有所收獲,下面我們一起來看看吧。

koa-compose

Koa-compose 是一個 Koa 中間件工具,Koa 是一個流行的 Node.js 網(wǎng)絡(luò)框架。Koa-compose 允許你將多個中間件函數(shù)組合成一個單獨的函數(shù),這樣可以更容易地管理和重用中間件。

在 Koa 中,中間件函數(shù)是按照特定順序調(diào)用的函數(shù),用于處理傳入的 HTTP 請求并生成響應。中間件函數(shù)可以執(zhí)行各種任務(wù),例如解析請求主體、驗證請求參數(shù)或與數(shù)據(jù)庫交互。

中間件的簡單示例:

// 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 中引用,如圖

Node.js網(wǎng)絡(luò)框架koa?compose中間件如何使用

上面中間件的作用是處理請求的結(jié)果。

洋蔥模型

洋蔥模型是一種用于解釋中間件的架構(gòu)模型。它描述了中間件的工作方式,以及中間件如何在處理請求和生成響應時與其他中間件協(xié)同工作。

在洋蔥模型中,中間件被描述為一個可以包裝在外層的函數(shù)。每個中間件函數(shù)都可以在接收到請求時執(zhí)行一些操作,然后將請求傳遞給內(nèi)層的中間件函數(shù)。當內(nèi)層的中間件函數(shù)完成工作并返回響應時,外層的中間件函數(shù)可以再次執(zhí)行一些操作,然后將響應返回給客戶端。

源碼解析

'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() 函數(shù)的參數(shù)是一個中間件數(shù)組,它包含了要組合的中間件函數(shù)。首先,代碼會檢查中間件數(shù)組是否是一個數(shù)組,并檢查數(shù)組中的每個元素是否都是函數(shù)。如果中間件數(shù)組不合法,就會拋出一個錯誤。

然后,compose() 函數(shù)會返回一個新的函數(shù),該函數(shù)接受兩個參數(shù):contextnext。context 對象包含了請求的上下文信息,例如請求路徑、請求參數(shù)等。next 函數(shù)是一個回調(diào)函數(shù),用于在當前中間件函數(shù)完成工作后調(diào)用下一個中間件函數(shù)。

變量 index,用于記錄最后一個被調(diào)用的中間件函數(shù)的編號。

在每次調(diào)用中間件函數(shù)之前,都會檢查當前中間件函數(shù)的編號是否小于等于 index 變量。如果是,就意味著 next() 函數(shù)被調(diào)用了多次,會返回一個錯誤。然后會更新 index 變量,并獲取下一個中間件函數(shù)。

如果當前中間件函數(shù)是最后一個中間件函數(shù),就會將 next 函數(shù)賦值給當前中間件函數(shù)。如果沒有更多的中間件函數(shù),就會返回一個已完成的 Promise 對象。

最后,調(diào)用當前中間件函數(shù),并返回一個 Promise 對象。如果在調(diào)用過程中發(fā)生錯誤則會拋出一個異常。

關(guān)于“Node.js網(wǎng)絡(luò)框架koa compose中間件如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Node.js網(wǎng)絡(luò)框架koa compose中間件如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI