# koa学习

let Koa =require("koa")

let app =new Koa();

app.use((ctx,next)=>{
	console.log(10)
	ctx.body=10
	next()
	console.log(11)
})
app.use((ctx,next)=>{
	console.log(20)
	ctx.body=11
	next()
	console.log(21)
})
app.use((ctx,next)=>{
	console.log(30)
	ctx.body=11
	next()
	console.log(31)
})

app.listen(7000,()=>{
	console.log("server is ok")
})
//10
//20
//30
//31
//21
//11

# 手写koa

  • 初步
//koa.js
let http =require("http")
class Koa{
	listen(...args){
		const server = http.createServer((req,res)=>{
			this.callback(req,res)
		})
		server.listen(...args)
	}
	use(callback){
		this.callback=callback
	}
	
}
module.exports=Koa;
let Koa =require("./koa")
let app =new Koa();
app.use((req,res)=>{
	res.end(1888)
})

app.listen(7000,()=>{
	console.log("server is ok")
})
  • 封装上下文
//koa
let http =require("http")
const context = require('./context')
const request = require('./request')
const response = require('./response')
class Koa{ 
	listen(...args){
		const server = http.createServer((req,res)=>{
			const ctx = this.createContext(req, res)
			this.callback(ctx)
			res.end(ctx.body)
		})
		server.listen(...args)
	}
	use(callback){
		this.callback=callback
	}
	createContext(req, res) {
	    const ctx = Object.create(context)
	    ctx.request = Object.create(request)
	    ctx.response = Object.create(response)
	    ctx.req = ctx.request.req = req
	    ctx.res = ctx.response.res = res
	    return ctx
	}
	
}
module.exports=Koa;

//context
module.exports = {
    get url() {
        return this.request.url
    },
    get body() {
        return this.response.body
    },
    set body(val){
        this.response.body = val
    },
    get method() {
        return this.request.method
    }
}

//request
module.exports ={
    get url(){
		
        return this.req.url
    },

    get method(){
        return this.req.method.toLowerCase()
    }
}

//response
module.exports = {
    get body(){
		console.log(this._body,"this")
        return this._body
    },
    set body(val){
        this._body = val
    }
}
let Koa =require("./koa")

let app =new Koa();

app.use(ctx=>{
	let arr=[1,2,34]
	ctx.body=JSON.stringify(arr)
	ctx.url
	console.log(ctx.body)
	
})


app.listen(7000,()=>{
	console.log("server is ok")
})

# koa中间件

function compose(middlewares) {
	return function() {
		return dispatch(0);
		// 执行第0个
		function dispatch(i) {
			let fn = middlewares[i];
			if (!fn) {
				return Promise.resolve();
			}
			return Promise.resolve(
				fn(function next() {
					// promise完成后,再执行下一个
					return dispatch(i + 1);
				})
			);
		}
	};
}


async function fn1(next) {
	console.log("fn1");
	await next();
	console.log("end fn1");
}
async function fn2(next) {
	console.log("fn2");
	await delay();
	await next();
	console.log("end fn2");
}
function fn3(next) {
	console.log("fn3");
}
function delay() {
	return new Promise((reslove, reject) => {
		setTimeout(() => {
		reslove();
		}, 2000);
	});
}
const middlewares = [fn1, fn2, fn3];
const finalFn = compose(middlewares);
finalFn();

// fn1
// fn2
// fn3
// end fn2
// end fn1
//koa
let http =require("http")
const context = require('./context')
const request = require('./request')
const response = require('./response')
class Koa{ 
	constructor(middlewares) {
	    this.middlewares=[]
	}
	listen(...args){
		const server = http.createServer(async (req,res)=>{
			const ctx = this.createContext(req, res)
			const fn =this.compose(this.middlewares)
			await fn(ctx)
			// this.callback(ctx)
			res.end(ctx.body)
		})
		server.listen(...args)
	}
	// use(callback){
	// 	this.callback=callback
	// }
	use(middleware){
		this.middlewares.push(middleware)
	}
	createContext(req, res) {
	    const ctx = Object.create(context)
	    ctx.request = Object.create(request)
	    ctx.response = Object.create(response)
	    ctx.req = ctx.request.req = req
	    ctx.res = ctx.response.res = res
	    return ctx
	}
	compose(middlewares) {
		return function(ctx) {
			return dispatch(0);
			// 执行第0个
			function dispatch(i) {
				let fn = middlewares[i];
				if (!fn) {
					return Promise.resolve();
				}
				return Promise.resolve(
					fn(ctx,function next() {
						// promise完成后,再执行下一个
						return dispatch(i + 1);
					})
				);
			}
		};
	}
	
}
module.exports=Koa;
let Koa =require("./koa")

let app =new Koa();

const delay = () => Promise.resolve(resolve => setTimeout(() => resolve()
,2000));
app.use(async (ctx, next) => {
	ctx.body = "1";
	await next();
	ctx.body += "5";
});
app.use(async (ctx, next) => {
	ctx.body += "2";
	await delay();
	await next();
	ctx.body += "4";
});
app.use(async (ctx, next) => {
	ctx.body += "3";
});

app.listen(7000,()=>{
	console.log("server is ok")
})
//12345
最后更新: 4/5/2020, 7:06:00 PM