强烈安利廖雪峰老师的
koa - 廖雪峰的官方网站 (liaoxuefeng.com)
1.简单的koa2代码
-1.hello koa代码
const Koa = require('koa');const app = new Koa();app.use(async (ctx, next) => {await next();ctx.response.body = "hello koa";
});app.listen(8000);
console.log('app started at port 8000...');
-2.利用127.0.0.1:8000(本机ip+所设置的端口号)进行访问
*因为现在有些ip是动态,即不断变化的。所以我们用127.0.0.1来回送本机ip
*一个端系统不仅可以提供HTTP服务,还可提供其他服务,所以我们使用ip+端口号进行访问
-3.代码解释
const Koa = require('koa'); //引入koa模块
const app = new Koa(); //创建koa模块的对象app
其余部分在下面解释
2.app.listen()——端口监听
-1.如果我们想通过3000端口进行访问,那么我们该如何修改1中的代码?
...
app.listen(3000);
console.log('app started at port 3000...');
-2.app.listen()
*调用了app.listen()实现了端口监听的作用
*console.log()是指在控制台(终端)输出
3.app.use() ——中间件middleware和异步函数
-1.分别运行下面两段代码,在网页中显示的是相同的结果吗?
const Koa = require('koa');const app = new Koa();app.use(async (ctx, next) => {ctx.response.body = "hello koa2";await next();
});app.use(async (ctx, next) => {await next();ctx.response.body = "hello koa";
});app.listen(8000);
console.log('app started at port 8000...');
const Koa = require('koa');const app = new Koa();app.use(async (ctx, next) => {await next();ctx.response.body = "hello koa2";
});app.use(async (ctx, next) => {await next();ctx.response.body = "hello koa";
});app.listen(8000);
console.log('app started at port 8000...');
结果是不同的!
分别是hello koa和hello koa2
导致这两种不同结果的原因又是什么呢?
-2.理解异步
理解异步 - 掘金 (juejin.cn)
*见上面这篇文章,解释的很好
-3.app.use()和async关键字
每收到一个http请求,koa2就会调用app.use()来进行反馈
async声明了这个函数是个异步函数,并且传入ctx和next参数
-4.await关键字
代码中,或许有许多的app.use(),koa2通过将其组成了一个处理链,每个app.use()是一个中间件middleware,在每个中间件做自己的事情。
那么处理的顺序由什么决定呢?
答案是使用await next():当遇到了await next()后,就执行下一个async,当下一个async执行完后,在返回执行await next()后的语句
*如果中间件不调用await next(),则后面的中间件不在实现
*后面没有中间件了,await next()就相当于没了
-5.如果已经掌握了处理链顺序,请看下面的问题
//数字输出的顺序是什么?
const Koa = require('koa');const app = new Koa();app.use(async (ctx, next) => {await next();console.log('1');
});app.use(async (ctx, next) => {console.log('2');await next();
});app.use(async (ctx, next) => {await next();console.log('3');
});app.use(async (ctx, next) => {console.log('4');await next();
});app.listen(8000);
console.log('app started at port 8000...');
答案是2 4 3 1
4.知识补充
-1.ctx对象有很多属性
ctx.request.method
ctx.request.url
-2.ctx对象有许多简写
ctx.request.url==ctx.url
ctx.reponse.type==ctx.type