application.js

const http = require("http")
// 洋葱模型
function compose(middleware){
return function(ctx,next){
let index = -1
return dispatch(0)
function dispatch(i){
if(i <= index ){
return Promise.reject(new Error("what!!"))
}
index = i
fn =middleware[i]
if (i === middleware.length){fn = next }
if(!fn){
return Promise.resolve()
}
try {
return Promise.resolve(fn(ctx,dispatch.bind(null,++i))) } catch (error) {
return Promise.reject(error) }
}
}
}
class Koa {
constructor(options){
this.options = options
this.middleware = []
}
use(fn){
if(typeof fn !== "function"){
throw new Error("not a function")
}
this.middleware.push(fn)
}
listen(){
let server = http.createServer(this.callback())
server.listen(...arguments)
}
callback(){
let fnMiddleWare = compose(this.middleware)
let handleRequest = (req,res)=>{
this.handleRequest(fnMiddleWare,req,res)
}
return handleRequest
}
handleRequest(fnMiddleWare,req,res){
let ctx = this.createContext(req,res)
fnMiddleWare(ctx).then(this.handleResponse).catch(this.handleError)
}
handleResponse(){}
handleError(){}
createContext(req,res){
//不会破坏原对象,方便扩展
let ctx = Object.create({})
ctx.req = req;
ctx.res =res;
return ctx
}
}
module.exports = Koa

使用:

const koa = require("./koa/application")
const app = new koa()
app.use(async (ctx,next)=>{
ctx.res.write("111")
await next()
ctx.res.write("333")
ctx.res.end()
})
app.use(async (ctx,next)=>{
ctx.res.write("222")
await next()
})
app.listen(3000);

  

几十行代码实现简易版koa~的更多相关文章

  1. 纯css爱心代码-最近超级火的打火机与公主裙中的爱心代码(简易版)

    theme: cyanosis 最近打火机与公主裙中的爱心代码超级火,看着特别心动,让俺用css来写个简易版!!! 先看效果: 代码拆解: 主要是分为3大部分 分子颗粒 爱心 动画 代码实现: 分子颗 ...

  2. 10行代码实现简易版的Promise

    实现之前,我们先看看Promise的调用 const src = 'https://img-ph-mirror.nosdn.127.net/sLP6rNBbQhy0OXFNYD9XIA==/79910 ...

  3. 自己实现IOC容器,java代码实现简易版IOC容器,IOC容器实现的步骤分解

    一.需求 实现一个简易的IOC容器,管理Bean,从IOC容器的BeanFactory中获取实例,从而取代自己new实例的做法. 二.实现步骤分析 三.具体代码实现 自定义注解类 MyComponen ...

  4. Vue源码分析之实现一个简易版的Vue

    目标 参考 https://cn.vuejs.org/v2/guide/reactivity.html 使用 Typescript 编写简易版的 vue 实现数据的响应式和基本的视图渲染,以及双向绑定 ...

  5. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  6. MVC 验证码实现( 简易版)

    现在网站上越来越多的验证码,使用场景也是越来越多,登陆.注册.上传.下载...等等地方,都有可能大量使用到验证码,那么制作验证码到底有多简单呢?我们一起来看下最简易版的验证码实现过程- 验证码的基本步 ...

  7. 简易版自定义BaseServlet

    这几天在学Java Web,一直在思考Servlet重用的问题,就用java的反射机制实现自定义的简易版BaseServlet; 该方式有点像struts2 利用映射获取前端的参数.有兴趣的同学可以自 ...

  8. 简易版的TimSort排序算法

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 简易版本TimSort排序算法原理与实现 TimSort排序算法是Python和Ja ...

  9. Python写地铁的到站的原理简易版

    Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...

  10. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

随机推荐

  1. Android病毒分析基础(二)—ChatGPT提问技巧

    今天我们来用最近比较火的"ChatGPT"学习一下Android病毒分析基础,看看和我们之前学的有什么不同,又能学习到什么新的东西,同时了解一下"ChatGPT" ...

  2. element-ui下表格头部字段hover显示tips信息

    记录一下表格头部加hover之后显示tips信息循环,或单独的el-table-column都可以哦 <el-table-column             prop="name&q ...

  3. 关于vscode 一些配置

    一. 基本操作 1.创建完项目, code .   直接在vscode 中打开 2.设置--首选项  检测 package.json 文件   点击serve 是可以运行 3.常用的vscode 插件 ...

  4. Springboot 拦截器的配置

    在Springboot项目中添加拦截器,分两步: 1:创建一个拦截器类 2:配置拦截器 以上步骤完成就可以使用了,下面来添加拦截器: 1:创建一个拦截器类 MyInteceptor 继承 Handle ...

  5. Asp.NET core/net 5接口返回实体含有long/int64的属性序列后最后几位变为0的解决

    Asp.NET core /net 5接口返回实体含有long/int64的属性时,序列后最后几位变为0的. 不得不吐槽一下MS,这种事还有问题,NND. 解决方案在startup.cs中添加:opt ...

  6. 解决CORS跨域问题

    首先创建一个实现Filter的cors过滤器 import lombok.extern.slf4j.Slf4j; import org.springframework.context.Applicat ...

  7. 【面试题】XSS攻击是什么?

    XSS攻击是什么? 要点: XSS是跨站脚本攻击.向目标网站插入恶意代码.大量用户访问网站时运行恶意脚本获取信息 答: XSS是跨站脚本攻击(Cross Site Scripting),不写为CSS是 ...

  8. sql server某列数据值逐行累加

    sql语句示例: DECLARE @pts varchar(max)='[{"x":5.801718000000000e+002,"y":3.633722000 ...

  9. vue中的Swiper使用slideTo提示no function

    参考官网资料解决:

  10. oracle system 账户被锁或者忘记密码

    首先打开SQL PLUS 然后执行conn /as sysdba,不用输入口令直接登录. 登录成功! 若登录的时候出错,这是由于权限不足. 接下来打开[计算机管理],选择[本地用户和组],展开[组], ...