koa框架(一) 认识koa
创始人
2024-02-03 17:09:36

koa

  • ​koa是express原班人马打造的轻量、健壮、富有表现力的nodejs框架。目前koa有koa1和koa2两个版本;koa2依赖Node.js 7.6.0或者更高版本;koa不在内核方法中绑定任何中间件,它仅仅是一个轻量级的函数库,几乎所有功能都必须通过第三方插件来实现。

koa 的使用

基本服务

  • koa安装
    npm i koa
  • 一个简单的koa服务器
    const Koa = require('koa');
    const app = new Koa();app.use(async ctx => {ctx.body = 'Hello World';
    });
    app.listen(3000);
    
  • koa 利用中间件 控制“上游”,调用”下游“;
    • koa是包含一组中间件函数的对象;可以将app.use里的函数理解成中间件

      //这里的middleWare函数就是一个中间件
      let middleWare = async (ctx,next)=>{console.log("first middleWare");ctx.body = "hello world";
      }
      app.use(middleWare);
      
    • 通过next()将控制转交给另一个中间件;

    • 上述过程也可以通过"洋葱模型“来解释中间件执行顺序
      在这里插入图片描述

Application对象

  • application是koa的实例,简写app
  • app.use 将给定的中间件方法添加到此应用程序,分为同步和异步,异步:通过es7中的async和await来处理
  • app.listen设置服务器端口;
  • app.on 错误处理;

上下文context对象常用属性及方法

  • context 将node中的requestresponse封装到一个对象中,并提供一些新的api提供给用户进行操作;

  • ctx.app:应用程序实例引用,等同于app;

    • ctx.req: Node 的 request 对象.
    • ctx.res: Noderesponse` 对象.
    • ctx.request: koa中的Request对象;
    • ctx.response: koa中的response对象;
    • ctx.state:对象命名空间,通过中间件传递信息;
    • ctx.throw: 抛出错误;
  • requestresponse别名

    • koa会把ctx.requset上的属性直接挂载到ctx上如:

      • ctx.header
      • ctx.headers
      • ctx.method
      • ctx.method=
      • ctx.url
      • ctx.url=
        ……
    • 同样也会把ctx.response上的属性直接挂载到ctx上如:

      • ctx.body
      • ctx.body=
      • ctx.status
      • ctx.status=
        ….

      ctx.status 获取响应状态。默认情况下,response.status 设置为 404 而不是像 node 的 res.statusCode 那样默认为 200

koa常用中间件介绍

koa-router

  • 路由是引导匹配之意,是匹配url到相应处理程序的活动。
  • koa-router推荐使用RESTful架构API。Restful的全称是Representational State Transfer 即表现层转移。
    • RESTful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。基于这个风格设计可以更简洁,更有层次;
    • RESTful设计一般符合如下条件:
      • 程序或者应用的事物都应该被抽象为资源
      • 每个资源对应唯一的URI(uri是统一资源标识符)
      • 使用统一接口对资源进行操作
      • 对资源的各种操作不会改变资源标识
      • 所有操作都是无状态的
  • koa-router安装
    npm i koa-router -S
  • 基本使用
const KoaRouter = require('koa-router');
const router = new KoaRouter();
router.get('/login', ctx => {ctx.body = '登陆';
})
app.use(router.routes());

koa-views

  • Koa-views用于加载html模板文件;
  • 安装 koa-views
    npm i koa-views -S
    • 使用koa-view

koa-static

  • koa-static是用于加载静态资源的中间件,通过它可以加载css、js等静态资源;
  • 安装 koa-static
    npm i koa-static
  • 使用koa-static
  const static = require("koa-static");//加载静态文件的目录app.use(static(__dirname+"/static"),{index:false,       // 默认为true  访问的文件为index.html  可以修改为别的文件名或者falsehidden:false,      // 是否同意传输隐藏文件defer:true,		   // 如果为true,则在返回next()之后进行服务,从而允许后续中间件先进行响应}) 

koa-static-cache

  • 作用同koa-static,但是可以配置缓存策略
  • 安装 koa-static-cache
    npm i koa-static-cache
  • 使用koa-static-cache
const KoaStaticCache = require('koa-static-cache');
app.use(KoaStaticCache('./static', {prefix: '/public',  // URL前缀,默认是 '.'maxAge: 0,     // 缓存时间,单位毫秒,默认为0gzip: true,   // 启用gzip压缩传输,默认为truedynamic: true  
}));

koa-body

  • 安装 koa-body
    npm i koa-body
  • 使用koa-body
const koaBody = require('koa-body');
app.use(koaBody({multipart: true,// 处理上传的二进制文件formidable: {// 上传目录uploadDir: __dirname + '/public/upload',// 是否保留上传文件名后缀keepExtensions: true,onFileBegin(name, file) {// console.log('name, file', name, file);return false;}}
}));

demo

  • app.js
const Koa = require('koa');
const KoaRouter = require('koa-router');
const KoaStaticCache = require('koa-static-cache');
// 创建 server 对象
const server = new Koa();
// 创建静态文件代理服务
server.use( KoaStaticCache('./public', {prefix: '/public',gzip: true,dynamic: true
}) );
// 除了上面以 /public 开头的url,其它都会走下面router进行处理
// 创建动态资源(使用router来为动态资源做映射)
// 创建一个router对象
const router = new KoaRouter();
// 用 router 来注册各种需要用到的url资源处理函数
router.get('/', ctx => {ctx.body = 'Hello';
});
router.get('/getData', ctx => {// 不是合法的json格式// ctx.body = "{'name': 'koa'}";// 必须是双引号// ctx.set('Content-Type', 'application/json;charset=utf-8');// ctx.body = '{"name": "koa"}';// koa 框架内部帮助我们做了一些处理,如果你给body设置一个对象,那么koa内部会把这个对象转成json以后再发送,同时设置头信息application/json;charset=utf-8ctx.body = {name: 'koa'};// ctx.type = 'application/json;charset=utf-8';// 等同下面的代码// ctx.set('Content-Type', 'application/json;charset=utf-8');
});
router.post('/attachment', upload('/static/attachment'), async ctx => {console.log(ctx.files);ctx.body = '上传成功';
});
// 把router对象的routes中间件注册到Koa中
server.use(router.routes());
// 启动服务,并监听指定的端口
server.listen(8081, () => {console.log('服务启动成功,http://localhost:8081');
});function upload(dir) {return koaBody({// 开启二进制content-type类型的处理multipart: true,formidable: {uploadDir: __dirname + dir,keepExtensions: true,onFileBegin(name, file) {// console.log('name, file', name, file);return false;}}});
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...