当前位置:网站首页 > iOS应用开发 > 正文

Web应用开发框架-koa(三)——koa中间件之概念、洋葱模型-执行顺序、异步中间件、koa-compose中间件合成-compsoe函数

Web应用开发框架-koa(三)——koa中间件之概念、洋葱模型-执行顺序、异步中间件、koa-compose中间件合成-compsoe函数

中间件

1.logger

Koa 的最大特色,也是最重要的一个设计,就是中间件(middleware)。为了理解中间件,我们先看一下 Logger (打印日志)功能的实现。

最简单的写法就是在main函数里面增加一行。

const main = ctx => { 
    console.log(`${ 
     Date.now()} ${ 
     ctx.request.method} ${ 
     ctx.request.url}`); ctx.response.body = 'Hello World'; }; 
2. 中间件的概念

上一个例子里面的 Logger 功能,可以拆分成一个独立函数。

const logger = (ctx, next) => { 
    console.log(`${ 
     Date.now()} ${ 
     ctx.request.method} ${ 
     ctx.request.url}`); next(); } app.use(logger); 
实例1

logger.js

var koa = require('koa'); var app = new koa(); var route = require('koa-route'); // 中间件 - 日志 中间件 // 中间件的核心其实是 koa在use里面注入的 next方法 var logger = (ctx, next) => { 
    next(); console.log(` 中间件执行--- 方法: ${ 
     ctx.request.method} 路径: ${ 
     ctx.request.path}`); } const main = (ctx, next) => { 
    // console.log(`方法: ${ctx.request.method} 路径: ${ctx.request.path}`); ctx.response.body = 'hello world'; next(); console.log('main') } const qita = (ctx, next) => { 
    // console.log(`方法: ${ctx.request.method} 路径: ${ctx.request.path}`); ctx.response.body = 'qita'; next(); } app.use(logger); app.use(route.get('/', main)); // 1. 路径 2. ctx函数 app.use(route.get('/qita', qita)); app.listen(3000); // 起服务 , 监听3000端口 
3.中间件执行顺序
const one = (ctx, next) => { 
    console.log('>> one'); next(); console.log('<< one'); } const two = (ctx, next) => { 
    console.log('>> two'); next(); console.log('<< two'); } const three = (ctx, next) => { 
    console.log('>> three'); next(); console.log('<< three'); } app.use(one); app.use(two); app.use(three); 

结果如下:

>> one >> two >> three << three << two << one 

洋葱模型

其实就是想向我们表达,调用next的时候,中间件的代码执行顺序是什么。

在这里插入图片描述

实例2

model.js

var koa = require('koa'); var app = new koa(); // next前面的代码,按照use的顺序执行,next后面的代码反着执行。 // koa结论: next方法其实就是指的, 当前执行函数的下一个use里面的方法。 const one = (ctx, next) => { 
    console.log('>> one'); next(); // tow console.log('<< one'); } const two = (ctx, next) => { 
    console.log('>> two'); next(); // three console.log('<< two'); } const three = (ctx, next) => { 
    console.log('>> three'); next(); // 空 console.log('<< three'); } // 他们3个都是中间件, next app.use(one); app.use(two); app.use(three); app.listen(3000); 
4.异步中间件

迄今为止,所有例子的中间件都是同步的,不包含异步操作。如果有异步操作(比如读取数据库),中间件就必须写成 async 函数。请看

const fs = require('fs.promised'); const Koa = require('koa'); const app = new Koa(); const main = async function (ctx, next) { 
    ctx.response.type = 'html'; ctx.response.body = await fs.readFile('./demos/template.html', 'utf8'); }; app.use(main); app.listen(3000); 
实例3

async.js

var koa = require('koa'); var app = new koa(); // next前面的代码,按照use的顺序执行,next后面的代码反着执行。 var log3 = function() { 
    return new Promise((res, rej) => { 
    setTimeout(() => { 
    console.log('<< three'); res() }, 2000); }); } // koa结论: next方法其实就是指的, 当前执行函数的下一个use里面的方法。 const one = async function(ctx, next) { 
    console.log('>> one'); await next(); // tow console.log('<< one'); } const two = async function(ctx, next) { 
    console.log('>> two'); await next(); // three console.log('<< two'); } // koa支持 es7 async和 await const three = async function(ctx, next) { 
    console.log('>> three'); next(); // 空 // console.log('<< three'); // await setTimeout(() => { // await需要 promise // console.log('<< three') // }; await log3(); } // three(); // 他们3个都是中间件, next app.use(one); app.use(two); app.use(three); app.listen(3000); 
5. 中间件的合成

koa-compose模块可以将多个中间件合成为一个。

const compose = require('koa-compose'); const logger = (ctx, next) => { 
    console.log(`${ 
     Date.now()} ${ 
     ctx.request.method} ${ 
     ctx.request.url}`); next(); } const main = ctx => { 
    ctx.response.body = 'Hello World'; }; const middlewares = compose([logger, main]); app.use(middlewares); 
compose简单介绍
var greeting = (firstName, lastName) => 'hello, ' + firstName + ' ' + lastName var toUpper = str => str.toUpperCase() var fn = compose(toUpper, greeting) console.log(fn('jack', 'smith')) // Hello Jack Smith 
  • compose的参数是函数,返回的也是一个函数
  • 因为除了第一个函数的接受参数,其他函数的接受参数都是上一个函数的返回值,所以初始函数的参数是多元的,而其他函数的接受值是一元
  • compsoe函数可以接受任意的参数,所有的参数都是函数,且执行方向是自右向左的,初始函数一定放到参数的最右面

参考链接: https://segmentfault.com/a/94749

到此这篇Web应用开发框架-koa(三)——koa中间件之概念、洋葱模型-执行顺序、异步中间件、koa-compose中间件合成-compsoe函数的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • Web应用开发框架-koa(四)——koa错误处理之状态码 & koa抛错两种方式-try和catch、ctx.app.emit() & koa-body模块处理错误 & koa-body处理文件上传2024-11-28 18:45:04
  • Web应用开发框架-koa(五)——koa总结之koa特点、koa-route路由 & 中间件之洋葱模型、异步中间件、中间件的合成 & 错误处理之http状态码、koa抛出错误、错误处理中间件2024-11-28 18:45:04
  • Web应用开发框架-egg(一)——Egg入门、Egg与Koa的关系 & 快速入门之编写Controller、静态资源2024-11-28 18:45:04
  • Web应用开发框架-egg(二)——快速入门之模板渲染、编写helper扩展、编写Middleware、渐进式开发 & egg总结2024-11-28 18:45:04
  • Web应用开发框架-egg(三)01-基础功能——目录结构的约定之框架规定的目录、内置插件约定的目录 & 内置对象之Application、context、Request & Response等2024-11-28 18:45:04
  • Web应用开发框架-egg(三)02-基础功能——运行环境 & Config配置之多环境配置、配置写法、配置加载顺序、合并规则、配置结果2024-11-28 18:45:04
  • Web应用开发框架-egg(三)03-基础功能——中间件之编写中间件、中间件的配置、使用中间件、在框架和插件中使用中间件 & 中间件的通用配置项2024-11-28 18:45:04
  • Web应用开发框架-koa(一)——koa入门与使用、context对象 & 读取并返回html片段之response把读取的内容返回给客户端2024-11-28 18:45:04
  • 嵌入式驱动开发和应用开发的区别(嵌入式软件开发和驱动开发)2024-11-28 18:45:04
  • 苹果个人开发者账号和企业开发者账号的区别(ios开发者账号个人版和企业版)2024-11-28 18:45:04
  • 全屏图片