koa是由express的原班人马打造的web框架。可是相对于express,koa的性能要更高,由于koa经过使用aysnc函数,帮你丢弃回调函数,并有力的加强了错误处理。并且koa没有绑定任何中间件,二十提供了一套优雅的方法,帮助你快死而愉快地编写服务端应用程序。javascript
与express的区别css
框架 | 推荐版本 | 是否自带中间件 | js语法 | 特性 |
express | 4.x | 是 | es5 | 回调嵌套 |
koa2 | 2.x | 否 | es7 | async/await+Promise |
koa依赖的node>v7.6.0html
npm i koa -D
要在 node < 7.6 版本的 Koa 中使用 async
方法, 咱们推荐使用 babel's require hook.java
建立hello world应用程序,在文件中建立server.js,文件内的代码以下node
const Koa = require('koa'); const app = new Koa(); app.use(async ctx => { ctx.body = 'Hello World'; }); app.listen(3000);
在终端中启动web
node server.js
服务启动以后,在浏览器中输入localhost:3000,就会看到页面显示的是hello world的字样数据库
由于koa自己是不带任何中间件的,因此使用路由的话,咱们须要安装koa的路由才行express
npm i koa-router -D
使用npm
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后端
既然是服务端语言,作项目的时候,先后端通讯确定是少不了请求方式处理的
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的send
ctx.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 |
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.params ctx.body=id; }) app.use(router.routes())
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.params ctx.body=id; next() })
app.use(router.routes());
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的话,koa里面已经封装好了,因此不须要咱们引入中间件
前面已经说到过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());
安装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}次来访`
})