最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

koa2 數(shù)據(jù)api中間件設(shè)計模型的實現(xiàn)方法

 更新時間:2020年07月13日 09:22:11   作者:誤人子弟  
這篇文章主要介紹了koa2 數(shù)據(jù)api中間件設(shè)計模型的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

假設(shè)所有的數(shù)據(jù)庫讀取,http api 接口請求都為一個中間件,將中間件當(dāng)做插件,插入需要獲取數(shù)據(jù)的位置。

api.js

module.exports = async (ctx, next) => {
 ctx.share_data.api_data = await axios.get('/api');

 await next();
};

db.js

module.exports = async (ctx, next) => {
 ctx.share_data.db_data = await mysql_query('SELECT XXX').catch(() => {});

 await next();
};

串聯(lián)

app.js

const api = require('api.js');
const db = require('db.js');
          
app.get('/get-api', api, (ctx) => ctx.body = ctx.share_data);
app.get('/get-db', db, (ctx) => ctx.body = ctx.share_data);
app.get('/get-api-and-db', api, db, (ctx) => ctx.body = ctx.share_data);

看著挺和諧,但是如果有多個數(shù)據(jù)中間件串聯(lián)則會導(dǎo)致接口的響應(yīng)時間為所有中間件的總和。

并發(fā)

可義一個 compose 函數(shù),需要并發(fā)的中間件包裝起來

super-compose.js

module.exports = (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!');
 }

 return async (context = {}, next = f => f) => {
  await Promise.all(
   middleware.map(middleware => {
    return new Promise((rs, rj) => {
     middleware(context, () => Promise.resolve())
      .then(rs)
      .catch(rj);
    });
   }),
  );

  await next();
 };
};

app.js

const api = require('api.js');
const db = require('db.js');
const superCompose = require('super-compose.js');
          
app.get('/get-api-and-db', superCompose([api, db]), (ctx) => ctx.body = ctx.share_data);

依賴關(guān)系

看著貌似解決了,但如何處理具有上下文依賴的情況呢?例如 api_1 依賴 api 的數(shù)據(jù)。
改下 api.js,加上緩存校驗。處理可能被多次compose的重復(fù)接口調(diào)用

module.exports = async (ctx, next) => {
 if (ctx.share_data.api_data) {
  return await next();
 }

 ctx.share_data.api_data = await axios.get('/api');

 await next();
};

api-1.js

const api = require('api.js');

module.exports = compose([
 api,
 async (ctx, next) => {
  const { api_data: { api_data: { id = 0 } = {} } = {} } = ctx;

  if (id < 0) {
   await next();
  } else {
   ctx.api_data.api_1_data = await axios.get('/api', { params: { id } });
  }

  await next();
 },
])

app.js

const api_1 = require('api_1.js');
const db = require('db.js');
const superCompose = require('super-compose.js');
          
app.get('/get-api-and-db', superCompose([api_1, db]), (ctx) => ctx.body = ctx.share_data);

跳過中間件

有時候,需要根據(jù)特定的條件,繞過某些接口調(diào)用

改造下 api.js,通過加入過濾列表

module.exports = async (ctx, next) => {
 const { break_list = [] } = ctx;


 if (break_list.includes('api_data')) {
  // 可能會誤傷其他組合引用該中間件的情況。
  // 如可能會誤傷,可加上。
  // ctx.break_list = break_list.filter(v => v !== 'api_data')
  return await next();
 } else {
  ctx.share_data.api_data = await axios.get('/api');
 }

 await next();
}

app.js

const api = require('api.js');
const db = require('db.js');
const superCompose = require('super-compose.js');
          
app.get(
 '/get-api-and-db',
 async (ctx, next) => {
  ctx.break_list = ['api_data'];
  await next();
 },
 superCompose([api, db]),
 ctx => (ctx.body = ctx.share_data)
);

數(shù)據(jù)合并處理

結(jié)合 super-compose 與 koa-compose 將所有需要的中間件組合起來,在寫一個針對頁面的controller

const api = require('api.js');
const db = require('db.js');
const superCompose = require('super-compose.js');
const compost = rquire('koa-compose')

const babala = compose([
 superCompose([api, db]),
 async (ctx, next) => {
  const {
   share_data: { api_data: { id = 0 } = {}, db_data: { title } = {} } = {},
  } = ctx;

  ctx.body = { id, title };
  // OR
  // ctx.share_data.babala = {}
 },
]);

app.get(
 '/get-api-and-db',
 babala
);

結(jié)尾

解決經(jīng)常出現(xiàn)的一個函數(shù)內(nèi)大量的接口、邏輯操作,超長的上下文邏輯。

app.get('/api', async ctx => {
 const api_1 = await axios.get('/api_1');
 await api_2 = await axios.get('/api_2');

 // ...
 // ...
 // 這里有一百行
 // ... 
 
 const [api_3, api_4] = await new Promise.all([axios.get('/api_3'), axios.get('/api_4')]);
 
 // ...
 // ...
 // 這里有幾百行
 // ...

 ctx.body = {};
});

以上就是koa2 數(shù)據(jù)api中間件設(shè)計模型的實現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于koa2 中間件設(shè)計模型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Node.js實現(xiàn)HTTP 206內(nèi)容分片的教程

    使用Node.js實現(xiàn)HTTP 206內(nèi)容分片的教程

    這篇文章主要介紹了使用Node.js實現(xiàn)HTTP 206內(nèi)容分片的教程,Node.js是一款用于服務(wù)器端的JavaScript框架,需要的朋友可以參考下
    2015-06-06
  • 利用Node.JS實現(xiàn)郵件發(fā)送功能

    利用Node.JS實現(xiàn)郵件發(fā)送功能

    其實利用Node.JS實現(xiàn)郵件發(fā)送這個功能很多人都寫過了,但是網(wǎng)上有的代碼不能用,版本較老,所以想著寫下自己摸索的方法來實現(xiàn)?,F(xiàn)在分享給大家,感興趣的朋友們可以一起學(xué)習(xí)學(xué)習(xí)。
    2016-10-10
  • npm報錯:npm?WARN?config?global?'--global',?'--local'?are?deprecated解決

    npm報錯:npm?WARN?config?global?'--global',?&apo

    這篇文章主要給大家介紹了關(guān)于npm報錯:npm?WARN?config?global?'--global',?'--local'?are?deprecated.?Use?`--location=global`?instead.的解決方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 解決node.js中bcrypt遇到的安裝問題

    解決node.js中bcrypt遇到的安裝問題

    這篇文章主要介紹了解決node.js中bcrypt遇到的安裝問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Nodejs 識別圖片類型的方法

    Nodejs 識別圖片類型的方法

    這篇文章主要介紹了Nodejs 識別圖片類型的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解如何實現(xiàn)一個簡單的Node.js腳手架

    詳解如何實現(xiàn)一個簡單的Node.js腳手架

    本篇文章主要介紹了如何實現(xiàn)一個簡單的Node.js腳手架,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 推薦 21 款優(yōu)秀的高性能 Node.js 開發(fā)框架

    推薦 21 款優(yōu)秀的高性能 Node.js 開發(fā)框架

    Node.js是JavaScript中最為流行的框架之一,易于創(chuàng)建可擴展的Web應(yīng)用。Node.js包含不同類型框架,包括MVC, full-stack,REST API以及Generators。借助這些框架使Node.js更加易于使用,它還支持眾多特性功能,只需幾個步驟就可快速搭建強大的Web應(yīng)用。本文為大家推薦21款
    2014-08-08
  • npm使用國內(nèi)淘寶鏡像的兩種方法

    npm使用國內(nèi)淘寶鏡像的兩種方法

    npm install時候,默認(rèn)是去npm鏡像源獲取,很多時候蝸牛一樣的速度,所以需要將安裝源設(shè)置成國內(nèi)的源,這樣速度就會快很多,本文就來介紹一下npm使用國內(nèi)淘寶鏡像的兩種方法,感興趣的可以了解一下
    2023-08-08
  • webstorm配置支持nodejs并自動補全的方法

    webstorm配置支持nodejs并自動補全的方法

    今天小編就為大家分享一篇webstorm配置支持nodejs并自動補全的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Grunt針對靜態(tài)文件的壓縮,版本控制打包的實例講解

    Grunt針對靜態(tài)文件的壓縮,版本控制打包的實例講解

    下面小編就為大家?guī)硪黄狦runt針對靜態(tài)文件的壓縮,版本控制打包的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

富宁县| 石楼县| 阳朔县| 深水埗区| 大埔区| 邢台县| 方正县| 济宁市| 白水县| 香港 | 府谷县| 淮安市| 宜黄县| 宁海县| 梨树县| 牟定县| 鲁山县| 遂宁市| 汝州市| 宁陵县| 德江县| 恭城| 安庆市| 牙克石市| 静安区| 绥江县| 宾阳县| 长春市| 体育| 南汇区| 灌南县| 寻乌县| 白银市| 鄂托克旗| 汕头市| 彭泽县| 河西区| 彩票| 皋兰县| 双牌县| 宜君县|