简介

koa是由express的原班人马打造的web框架。但是相对于express,koa的性能要更高,因为koa通过使用aysnc函数,帮你丢弃回调函数,并有力的增强了错误处理。而且koa没有绑定任何中间件,二十提供了一套优雅的方法,帮助你快死而愉快地编写服务端应用程序。

与express的区别

koa与express对比图
框架 推荐版本 是否自带中间件 js语法 特性
express 4.x es5 回调嵌套
koa2 2.x  es7 async/await+Promise

安装

koa依赖的node>v7.6.0

  1. npm i koa -D

要在 node < 7.6 版本的 Koa 中使用 async 方法, 我们推荐使用 babel's require hook.

创建hello world应用程序,在文件中创建server.js,文件内的代码如下

  1. const Koa = require('koa');
  2. const app = new Koa();
  3.  
  4. app.use(async ctx => {
  5. ctx.body = 'Hello World';
  6. });
  7.  
  8. app.listen(3000);

在终端中启动

  1. node server.js

服务启动之后,在浏览器中输入localhost:3000,就会看到页面显示的是hello world的字样

路由

因为koa本身是不带任何中间件的,所以使用路由的话,我们需要安装koa的路由才行

  1. npm i koa-router -D

使用

  1. const Koa=require('koa');
  2. const Router=require('koa-router');
  3.  
  4. let app=new Koa();
  5. server.listen(8080);
  6.  
  7. let router=new Router();
  8.  
  9. router.get('/news', async (ctx, next)=>{
  10.  
  11. ctx.body='hello world';
  12.  
  13. await next();
  14. });
  15.  
  16. app.use(router.routes());

启动服务后在浏览器地址栏打开:localhost:3000/news

请求方式

既然是服务端语言,做项目的时候,前后端通信肯定是少不了请求方式处理的

get请求

  1. const koa = require('koa');
  2. const Router = require('koa-router');
  3. let server = new koa();
  4. server.listen(2000, () => {
  5. console.log('port 2000 is running');
  6. })
  7. // 创建路由
  8. let router = new Router();
  9. // koa里面习惯于用async await ,有next方法,但是非常的少用
  10. router.get('/a', async ctx => {
  11. //相当于 express的send
  12. ctx.body = 'aaa';
  13. console.log(ctx.body)
  14. })
  15. // 最后需要把路由添加到服务器上
  16. server.use(router.routes())

post请求

post请求的话,需要使用到 koa-better-body模块

安装

  1. npm i koa-better-body

我们这里使用文件上传作为例子,在文件目录下新建一个static文件夹,并且在static文件夹里面建一个upload文件夹

  1. const koa=require('koa');
  2.  
  3. const body=require('koa-better-body');
  4. const app=new koa();
  5. app.listen(3000,()=>{
  6. console.log('server is running...');
  7. })
  8. app.use(body({
  9. uploadDir:'./static/upload'
  10. }))
  11. app.use(async ctx=>{
  12. //文件和post数据
  13. console.log(ctx.request.fields);
  14. ctx.body='数据提交成功啦'
  15. })

html文件中的表单使用的post请求

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <form action="http://localhost:3000/upload" method="post" enctype="multipart/form-data">
  11. <div>
  12. 用户名:<input type="text" name="username">
  13. </div>
  14. <div>
  15. 密码:<input type="password" name="password">
  16. </div>
  17. <div>
  18. 文件:<input type="file" name="file">
  19. </div>
  20. <div>
  21. <input type="submit" value="提交">
  22. </div>
  23. </form>
  24. </body>
  25. </html>

注意点:1 . 因为这边是文件上传,所以用到的是post请求,entype一定要写成multipart/form-data

    2. 上传完成后在upload文件夹里面能看到你刚刚上传的文件,后缀名可能是不一定是你上传的文件的后缀名,这不是上传失败,这是正常的后缀名是给人看的,不是给机器看的

传递参数

koa传参有两种方式 urlencodeded 和 params两种方式

query params
顺序灵活 顺序写死
可以省略 不能省略,否则会报not found
不利于SEO 利于SEO
 http://aaa.com/user?a=12&b=5 http://aaa.com/user/12/5

params 的实现方式    (http://localhost:3000/news/736273725)

  1. const koa=require('koa');
  2. const Router=require('koa-router');
  3. const app=new koa();
  4. const router=new Router();
  5. app.listen(3000);
  6. router.get('/news/:id',async (ctx,next)=>{
  7. let {id}=ctx.params
  8.  
  9. ctx.body=id;
  10. })
  11. app.use(router.routes())

query传参(http://localhost:3000/users?username=Cynthia&address=%E5%B9%BF%E5%B7%9E)

  1. const koa=require('koa');
  2. const Router=require('koa-router');
  3. const app=new koa();
  4. const router=new Router();
  5. app.listen(3000);
  6. router.get('/news/:id',async (ctx,next)=>{
  7. let {id}=ctx.params
  8.  
  9. ctx.body=id;
  10. next()
  11. })
router.get('/users/',async ctx=>{
let {username,address}=ctx.query;
ctx.body=`${username}你好,你的地址是${address}`
})
  1. app.use(router.routes());

上下文Context

Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。 这些操作在 HTTP 服务器开发中频繁使用,它们被添加到此级别而不是更高级别的框架,这将强制中间件重新实现此通用功能。

app.context相当于是ctx的原型(prototype).

常用:在使用数据库的时候,可以把数据库的对象添加到app.context上

  1. const koa=require('koa');
  2. const Router=require('koa-router');
  3. const app=new koa();
  4. // 添加数据库到全局
  5. app.context.db=require('./libs/database');
  6. // 因为所有的请求都会走这一步,所以在这边添加错误处理能提高性能
  7. app.use(async (ctx, next)=>{
  8. try{
  9. await next();
  10. }catch(e){
  11. ctx.body='错了';
  12. }
  13. });
  14. const router=new Router();
  15. router.get('/a',async ctx=>{
  16. // ctx.db.query(`SELECT * FROM user_table`,(err,data)=>{
  17. // if(err) return err;
  18. // console.log(data);
  19. // })
  20. // console.log(query)
  21. console.log(ctx.db);
  22. ctx.body='weqwe'
  23. })
  24. // 所有路由都会经过这里,所以在这边进行错误处理
  25. router.all('',async ctx=>{
  26. try{
  27. await next();
  28. }catch(e){
  29. ctx.body='没有该路由'
  30. }
  31. })
  32.  
  33. app.use(router.routes());
  34. app.listen(3000);

处理cookie

处理cookie的话,koa里面已经封装好了,所以不需要我们引入中间件

const koa=require('koa');
const app=new koa();
app.listen(3000);
// cookie是koa框架自带的
app.keys=[
'32312312312',
'fffkorieihrhewr289423',
'd3243wqdwewe2342323e',
'iweuweubnbejwb09039123',
'32323dssdsadsjadks2312'
]
app.use(async ctx=>{
// 设置cookie
// ctx.cookies.set('user','yue',{signed:true});
console.log(ctx.cookies.get('user',{signed:true}))
})

管理静态资源

前面已经说到过koa不带任何中间件,所以要管理静态资源的话,需要安装koa-static

  1. const koa=require('koa');
  2. const Router=require('koa-router');
  3. const static=require('koa-static');
  4. const app=new koa();
  5. let router=new Router();
  6. router.get('/user',async ctx=>{
  7. ctx.body='用户'
  8. })
  9.  
  10. app.use(router.routes());
  11. app.listen(3000,()=>{
  12. console.log('server is running....')
  13. })
  14. app.use(static('./static',{
  15. maxAge:86400*1000,// 设置缓存时间
  16. index:'1.html'// 根目录的时候打开这个文件
  17. }))

在项目中,因为不同的文件,我们需要设置缓存的时间不一样,我们可以进行下面的操作

  1. const Koa = require('koa');
  2. const Router = require('koa-router');
  3. const static = require('koa-static');
  4. const app = new Koa();
  5. app.listen(3000);
  6. let router = new Router();
  7. router.get('/user', async ctx => {
  8. ctx = '用户'
  9. })
  10. app.use(router.routes());
  11.  
  12. let staticRouter = new Router();
  13. staticRouter.all(/(\.jpg|\.png|\.gif)$/i, static('./static', {
  14. maxAge: 60 * 86400 * 1000
  15. }));
  16. staticRouter.all(/(\.css)$/i, static('./static', {
  17. maxage: 1 * 86400 * 1000
  18. }));
  19. staticRouter.all(/(\.html|\.htm|\.shtml)$/i, static('./static', {
  20. maxage: 20 * 86400 * 1000
  21. }));
  22. staticRouter.all('', static('./static', {
  23. maxage: 30 * 86400 * 1000
  24. }));
  25. app.use(staticRouter.routes());

session

安装koa-seesion

  1. const koa=require('koa');
  2. const session=require('koa-session');
  3. const app=new koa();
  4. app.listen(3000,()=>{
  5. console.log('port is running...')
  6. })
  7.  
  8. app.keys=[
  9. 'eehuehuwehwue',
  10. 'eweyweywewyqeuw',
  11. 'dhsjdhasdasjd',
  12. 'sdsadasdsa'
  13. ]
  14. app.use(session({
  15. maxAge:60*20*1000,// 有效期
  16. renew:true // 自动续期
  17. },app))
  18. app.use(async ctx=>{
  19. if(!ctx.session['view']){
  20. ctx.session['view']=1;
  21. }
  22. ctx.session['view']++
  23. ctx.body=`欢迎你第${ctx.session.view}次来访`
  24. })

  

手把手教你使用koa2的更多相关文章

  1. 手把手教你基于koa2,mongoose实现增删改查

    初始化项目 npm init -y 先安装一波乱七八糟的依赖插件(需要具备一定的koa2知识,至于mongoDB自行百度安装教程),模板引擎我使用的是art-template(据说是性能最好的,而且是 ...

  2. 手把手教你做个人 app

    我们都知道,开发一个app很大程度依赖服务端:服务端提供接口数据,然后我们展示:另外,开发一个app,还需要美工协助切图.没了接口,没了美工,app似乎只能做成单机版或工具类app,真的是这样的吗?先 ...

  3. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(四)-使用Travis自动部署Hexo(2)

    前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...

  4. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)

    前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...

  5. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置

    前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...

  6. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置

    前言 有朋友问了我关于博客系统搭建相关的问题,由于是做开发相关的工作,我给他推荐的是使用github的gh-pages服务搭建个人博客. 推荐理由: 免费:github提供gh-pages服务是免费的 ...

  7. UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包

    背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...

  8. 推荐!手把手教你使用Git

    推荐!手把手教你使用Git 原文出处: 涂根华的博客   http://blog.jobbole.com/78960/ 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与 ...

  9. 手把手教你写Sublime中的Snippet

    手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...

随机推荐

  1. 牛客网国庆集训派对Day6 题目 2018年

    链接:https://www.nowcoder.com/acm/contest/206/A来源:牛客网 Birthday 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576 ...

  2. IE8+SpringMVC文件上传防止JSON下载

    今天在IE8测试文件上传的时候发现总是提示下载,原因是上传接口返回的是json,通过以下修改就可以保证返回是json并且不会出现下载的情况: @RequestMapping(value = " ...

  3. js对数组进行浅复制,深复制的方法

    js 数组常用方法,数组的拷贝(不影响原数组),数组相等 置顶2017年07月17日 17:39:26 阅读数:4640 改变原数组的方法: pop();删除尾部的第一个元素并且返回这个元素: var ...

  4. 安装virtualbox

    1.安装virtualbox https://www.virtualbox.org/ 2.安装centos6.6 3.配置网络 右键-->网络-->网卡2-->host-only c ...

  5. 微信小程序 功能函数 替换字符串内的指定字符

    var str = 'abcadeacf'; var str1 = str.replace('a', 'o'); alert(str1);    // 打印结果: obcadeacf   var st ...

  6. docker weave安装

    1.升级内核到3.10.0以上,安装iproute22.安装 0.80版本:#wget -O /usr/local/bin/weave https://raw.githubusercontent.co ...

  7. 一个java高级工程师的进阶

    宏观方面 一. JAVA.要想成为JAVA(高级)工程师肯定要学习JAVA.一般的程序员或许只需知道一些JAVA的语法结构就可以应付了.但要成为JAVA(高级) 工程师,您要对JAVA做比较深入的研究 ...

  8. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  9. BZOJ2878 NOI2012迷失游乐园(树形dp+环套树+概率期望)

    考虑树的部分分怎么做.令f[i]为i向子树内走的期望路径长度,转移比较显然.算答案时先把其父亲的答案弄好就可以统计自己的答案了. 环套树也类似.树里直接dp,对环上点暴力考虑环上的每条路径,算完后再在 ...

  10. jingchi.ai 2017.11.25-26 Onsite面试

    时间:2017.11.25 - 11.26 地点:安徽安庆 来回路费报销,住宿报销. day1: 大哥哥问了我一个实际中他们遇到的问题.有n个点,将点进行分块输出,输出各个块的均值点.具体就是100* ...