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);

  

最新文章

  1. 【实践】Memcached实例解析
  2. jQuery 判断是否包含某个属性
  3. WPF阴影效果(DropShadowEffect)
  4. Tplink客户端设置
  5. Catia CAA 二次开发 ---- 开发准备(0)
  6. 关于NSNotificationCenter消息通信用法
  7. Java队列工具类(程序仅供练习)
  8. C# 文件夹加密
  9. [UOJ 74] 【UR #6】破解密码
  10. SQL 无限级分类语句
  11. UIP源码之ARP过程分析
  12. 14-TypeScript简单工厂模式
  13. I/O-----二进制文件的读写
  14. 第29月第21天 ios android curl
  15. 根据cookie记录跟踪ID来确定分享对象
  16. MAC OSX Xcode硬盘清理
  17. vue element upload图片 回显问题
  18. swift是强类型语言
  19. ConfigParser.NoSectionError: No section: &#39;MongoDB&#39;
  20. JavaScript 语法总结

热门文章

  1. MySQL Replication(数据同步技术)
  2. SQL Server迁移数据库文件(ldf&amp;amp;mdf文件)到其他盘
  3. 同一ip地址不同的主机冲突解决
  4. JavaWeb 之 Http
  5. 数据类型之字符串(string)(三)
  6. 关于java业务限流组件的应用推广
  7. SpringBoot的使用
  8. JavaSE——==与.equal()方法
  9. docker-swarm轻量集群
  10. Micro-OA系统