几十行代码实现简易版koa~

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);
复制代码

 

  

posted @   Esther_Cheung  阅读(65)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示