几十行代码实现简易版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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)