几十行代码实现简易版koa~
2024-09-07 22:28:58
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);
最新文章
- 【实践】Memcached实例解析
- jQuery 判断是否包含某个属性
- WPF阴影效果(DropShadowEffect)
- Tplink客户端设置
- Catia CAA 二次开发 ---- 开发准备(0)
- 关于NSNotificationCenter消息通信用法
- Java队列工具类(程序仅供练习)
- C# 文件夹加密
- [UOJ 74] 【UR #6】破解密码
- SQL 无限级分类语句
- UIP源码之ARP过程分析
- 14-TypeScript简单工厂模式
- I/O-----二进制文件的读写
- 第29月第21天 ios android curl
- 根据cookie记录跟踪ID来确定分享对象
- MAC OSX Xcode硬盘清理
- vue element upload图片 回显问题
- swift是强类型语言
- ConfigParser.NoSectionError: No section: &#39;MongoDB&#39;
- JavaScript 语法总结