简介

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

npm i koa -D

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

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

const Koa = require('koa');
const app = new Koa();app.use(async ctx => {ctx.body = 'Hello World';
});app.listen(3000);

在终端中启动

node server.js

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

路由

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

npm i koa-router -D

使用

const Koa=require('koa');
const Router=require('koa-router');let app=new Koa();
server.listen(8080);let router=new Router();router.get('/news', async (ctx, next)=>{ctx.body='hello world';await next();
});
app.use(router.routes());

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

请求方式

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

get请求

const koa = require('koa');
const Router = require('koa-router');
let server = new koa();
server.listen(2000, () => {console.log('port 2000 is running');
})
// 创建路由
let router = new Router();
// koa里面习惯于用async await ,有next方法,但是非常的少用
router.get('/a', async ctx => {//相当于 express的sendctx.body = 'aaa';console.log(ctx.body)
})
// 最后需要把路由添加到服务器上
server.use(router.routes())

post请求

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

安装

npm i koa-better-body

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

const koa=require('koa');const body=require('koa-better-body');
const app=new koa();
app.listen(3000,()=>{console.log('server is running...');
})
app.use(body({uploadDir:'./static/upload'
}))
app.use(async ctx=>{//文件和post数据
  console.log(ctx.request.fields);ctx.body='数据提交成功啦'
})

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

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><form action="http://localhost:3000/upload" method="post" enctype="multipart/form-data"><div>用户名:<input type="text" name="username"></div><div>密码:<input type="password" name="password"></div><div>文件:<input type="file" name="file"></div><div><input type="submit" value="提交"></div></form>
</body>
</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)

const koa=require('koa');
const Router=require('koa-router');
const app=new koa();
const router=new Router();
app.listen(3000);
router.get('/news/:id',async (ctx,next)=>{let {id}=ctx.paramsctx.body=id;
})
app.use(router.routes())

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

const koa=require('koa');
const Router=require('koa-router');
const app=new koa();
const router=new Router();
app.listen(3000);
router.get('/news/:id',async (ctx,next)=>{let {id}=ctx.paramsctx.body=id;next()
})
router.get('/users/',async ctx=>{
let {username,address}=ctx.query;
ctx.body=`${username}你好,你的地址是${address}`
})

app.use(router.routes());

上下文Context

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

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

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

const koa=require('koa');
const Router=require('koa-router');
const app=new koa();
// 添加数据库到全局
app.context.db=require('./libs/database');
// 因为所有的请求都会走这一步,所以在这边添加错误处理能提高性能
app.use(async (ctx, next)=>{try{await next();}catch(e){ctx.body='错了';}});const router=new Router();router.get('/a',async ctx=>{//  ctx.db.query(`SELECT * FROM user_table`,(err,data)=>{//     if(err) return  err;//     console.log(data);//  })//  console.log(query)
    console.log(ctx.db);ctx.body='weqwe'
})
// 所有路由都会经过这里,所以在这边进行错误处理
router.all('',async ctx=>{try{await next();}catch(e){ctx.body='没有该路由'}
})app.use(router.routes());
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

const koa=require('koa');
const Router=require('koa-router');
const static=require('koa-static');
const app=new koa();
let router=new Router();
router.get('/user',async ctx=>{ctx.body='用户'
})app.use(router.routes());
app.listen(3000,()=>{console.log('server is running....')
})
app.use(static('./static',{maxAge:86400*1000,// 设置缓存时间index:'1.html'// 根目录的时候打开这个文件
}))

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

const Koa = require('koa');
const Router = require('koa-router');
const static = require('koa-static');
const app = new Koa();
app.listen(3000);
let router = new Router();
router.get('/user', async ctx => {ctx = '用户'
})
app.use(router.routes());let staticRouter = new Router();
staticRouter.all(/(\.jpg|\.png|\.gif)$/i, static('./static', {maxAge: 60 * 86400 * 1000
}));
staticRouter.all(/(\.css)$/i, static('./static', {maxage: 1 * 86400 * 1000
}));
staticRouter.all(/(\.html|\.htm|\.shtml)$/i, static('./static', {maxage: 20 * 86400 * 1000
}));
staticRouter.all('', static('./static', {maxage: 30 * 86400 * 1000
}));
app.use(staticRouter.routes());

session

安装koa-seesion

const koa=require('koa');
const session=require('koa-session');
const app=new koa();
app.listen(3000,()=>{console.log('port is running...')
})app.keys=['eehuehuwehwue','eweyweywewyqeuw','dhsjdhasdasjd','sdsadasdsa'
]
app.use(session({maxAge:60*20*1000,// 有效期renew:true // 自动续期
},app))
app.use(async ctx=>{if(!ctx.session['view']){ctx.session['view']=1;}ctx.session['view']++ctx.body=`欢迎你第${ctx.session.view}次来访`
})

  

转载于:https://www.cnblogs.com/cythia/p/10471053.html

手把手教你使用koa2相关推荐

  1. 教你使用 koa2 + vite + ts + vue3 + pinia 构建前端 SSR 企业级项目

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 前言 大家好,我是 易[1],在上一篇文章中,我们有讲到<如何使用 vite+vue3 ...

  2. 2021年大数据Hive(三):手把手教你如何吃透Hive数据库和表操作(学会秒变数仓大佬)

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive数据库和表操作 一.数据库操作 1.创建数据库 2.创建 ...

  3. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  4. 手把手教你如何扩展GridView之自带CheckBox

    我们在使用GridView的时候,很多时候需要使用CheckBox列,比如批量删除,批量审批,但是每每都需要记住繁琐的实现方法.多麻烦呀!再次给GridView做个手术,让它自己就能产生CheckBo ...

  5. Linux环境搭建 | 手把手教你安装Linux虚拟机

    2019独角兽企业重金招聘Python工程师标准>>> 前言 作为一名Linux工程师,不管是运维.应用.驱动方向,在工作中肯定会需要Linux环境.想要获得Linux环境,一个办法 ...

  6. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  7. 手把手教你 MongoDB 的安装与详细使用(二)

    上一篇文章练习了,MongoDB 的以下操作 安装 MongoDB 服务 连接 MongoDB MongoDB 创建数据库 MongoDB 删除数据库 MongoDB 插入文档 MongoDB 删除文 ...

  8. 零门槛!手把手教你打造AI应用

    如你所见,聊天机器人已经逐渐渗透到生活的方方面面. 它可以提供生活娱乐方面的服务,比如查询音乐.地图.天气,做心理测试,甚至 Google 的 Duplex 技术还能让你通过机器人进行订餐,当然还有很 ...

  9. 今晚直播 | 谷歌资深工程师手把手教你使用TensorFlow最新API构建学习模型

    目前,深度学习的研究和应用大受追捧,各种开源的深度学习框架层出不穷.TensorFlow 作为目前最受欢迎的深度学习框架,已经在 GitHub 上获得了 112194 个 star,受欢迎程序可见一斑 ...

最新文章

  1. 对微软Web Deploy的一次艰难调试
  2. C#设计模式之装饰者
  3. 不使用加减乘除法,完成两个数的加法
  4. .NET 4.0有一个新的GAC,为什么?
  5. 对于五个问题的思考与感想
  6. java进制代码_Java将字节转换为十六进制代码分享
  7. 漫谈Google的Native Client(NaCl)技术
  8. Linux网络DNS配置反向解析与构建主从域名服务器
  9. Angular Universal 的演进历史
  10. C# 内存法图像处理
  11. 如何判断SVG事件对象中的鼠标来源?
  12. FutureV接口CallableV接口的使用
  13. ReactNative 踩坑之 iOS 原生组件
  14. linux如何批量清理文件大小,Linux下自动清理超过指定大小文件的方法
  15. 自学c语言每天一小时,昨天学习C语言第五天, 自学失败的一天
  16. lingo纳什均衡代码_数学建模练习题.
  17. H264格式说明及解析
  18. 虚拟机ip、主机ip、代理ip
  19. 微信小程序下拉刷新上拉加载
  20. 每日一记,养成记录的习惯

热门文章

  1. python新手程序员工资-程序员吐槽新同事:连我实习水平都不到,工资是我的1.7倍...
  2. 为什么要叫python-为什么我要学习python?
  3. python在线工具-6 种 Python 数据可视化工具
  4. python利器的使用-图文详解python开发利器之ulipad的使用实践
  5. python现在好找工作吗-推崇Python这么多人,为什么他们找不到工作!
  6. python的工作方向-Python最有发展潜力的方向已出来,是否有你喜欢的职位?
  7. python程序员又叫什么-Python程序员鲜为人知但你应该知道的17个问题
  8. 学好python工资一般多少钱-Python工资多少?就业发展前景怎么样?
  9. python能做软件开发吗-python代码能做成软件吗
  10. python编程入门 电子书-Python编程从入门到实践PDF电子书