express都没学,因为项目看起了koa的菜鸟飘过~
优点:
koa作为新一代的框架,由开发express的原班人马打造,支持ES7 async/await,抛弃回调函数,在写法上更自然。使用 Koa 编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提升错误处理的效率。Koa不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手,开发思路和 Express 差不多,最大的特点就是可以避免异步嵌套。
一.如何利用koa实现一个接口
1.初体验
启动步骤
-
引入Koa构造函数对象
const Koa = require('koa')
-
创建服务器示例对象
const app = new Koa();
-
配置中间件
app.use(做什么?)
-
监听端口启动服务器
app.listen()
const Koa = require('koa' );
const app = new Koa();
app.context.msg = 'Hello Koa!'
app.use(async ctx => {
ctx.body = ctx.msg;
});
app.listen( 3000);
这时访问3000端口就可以得到ctx.body 返回的内容
2.使用koa-router路由管理模块
var Koa = require('koa' );
var Router = require('koa-router' );
var app = new Koa();
var router = new Router();//路由实例化
//路由配置,当路由较多时,也可抽取为单独的路由配置js文件
//回调函数为路由处理函数,也可抽取为单独的路由处理js文件
router.get( '/', (ctx, next) => {
ctx.body = 'hello'
});
//使用路由中间件
//注册使用路由,让router替你接管url和处理函数之间的映射,而不需要你关心真实的访问路径如何
//当所有路由中间件执行完成之后,若ctx.status为空或者404的时候,丰富response对象的header头.
app.use(router.routes()).use(router.allowedMethods());
app.listen( 3000 )
3.借助中间件koa-bodyparser,访问 ctx.request.body 得到post参数
var bodyParser = require('koa-bodyparser');
app.use(bodyParser());
router.post('/doAdd', async (ctx) => {
// 通过ctx.request.body获取表单提交的数据
ctx.body=ctx.request.body;
// {"username":"aiguangyuan","password ":"123456"}
});
在引入 koa-bodyparser 时,需要注意的是顺序问题,使用 koa-bodyparser 需要放在使用路由之前,这是由于中间件执行顺序的原因(暂且理解为 bodyparser 经过处理,把处理好的值转交到路由).
顺便提一句有个koa-body中间件,可以获取前端上传来的文件。新版本的通过ctx.request.files获取上传的文件,旧版本的通过ctx.request.body.files获取上传的文件。
4.获取get参数的方式
(1).键值对拼接传参,接收参数主要通过ctx.qruery获取,需要注意的是在ctx与ctx.request里均可以获得一样的结果。
// http://localhost:3000/news_details?id=123&author=aiguangyuan
router.get('/news_details',async(ctx)=>{
console.log(ctx.query);
// { id: '123', author: 'aiguangyuan' }
// 获取的是对象,用的最多的方式
console.log(ctx.querystring)
// id=123&author=aiguangyuan
// 获取的是字符串
ctx.body='新闻详情页';
});
(2).动态路由传参,接收参数主要通过ctx.params获取。
// http://localhost:3000/news_details/123/456
router.get('/news_details/:aid/:cid', async (ctx) => {
// 获取动态路由的传值
console.log(ctx.params);
// { aid: '123' ,cid:'456'}
ctx.body = '新闻详情页';
});
5.通过 ctx.set 设置响应头,设置多个时可传入对象
router.post('/post', ctx=>{
//设置允许跨域
ctx.set('Access-Control-Allow-Origin','*')
ctx.body = {
code:1,
postParams:ctx.request.body
}
})
二.什么是中间件
中间件就是匹配路由(匹配任何路由或者特定的路由,其作用比如打印日志,查看权限)之前或者匹配路由完成之后所得一系列操作,功能有:
1.执行任何代码
2.修改请求和和响应对象
3.终结请求-响应循环
4.调用堆栈中的下一个中间件,通过next来实现
app.use([path],function)
在use方法中,使用两个参数,其中path参数为可选参数,function参数为必须指定参数。path参数值为一个字符串,用于指定何种路径应用中间件,默认参数值为“/”。function参数值为一个函数,用于指定我们所要调用的中间件函数。
(1)应用级中间件,添加应用,如常见的一些第三方中间件的使用,例如koa-bodyparser,koa-router,koa-static,koa-art-template,koa_session等等
//中间件(中间件要放在use(route)之前):
//例如:一个匹配任何路由,打印时间的中间件
app.use(async (ctx,next)=>{
console.log(new Date());
await next()//当前路由匹配完成之后继续向下匹配,如果不写await next(),就会终止路由
})
(2)路由级中间件,匹配路由。主要通过next()这个函数完成多级路由匹配。
router.get('/abc', async (ctx, next) => {
console.log("abc");
await next()//不写的话就不会继续向下匹配,也就是拿不到ctx.body
})
router.get('/abc', async (ctx, next) => {
ctx.body = '中间件'
})
(3)错误处理中间件,如果当前访问的路由一直向下匹配没有匹配到,可以通过中间件给出错误响应。
app.use(async (ctx,next)=>{
if(ctx.status==404){
ctx.status=404;
ctx.body="404页面"
}
})
(4)koa中间件执行顺序:Koa的路由执行顺序与Express有所不同,Koa 选择了洋葱圈模型,即最先访问的路由里的next()后面的代码最后响应。
app.use(async (ctx,next)=>{
console.log("1");
await next();
console.log("3")
})
app.use(async (ctx,next)=>{
console.log("2");
await next()
console.log("4")
})
输出1234
(5)如何自定义中间件