# 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
koa初步学习 →