koa简介

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)如何自定义中间件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值