koa
koa与express
区别: 本身区别不是特别大,但写法上不太一样
express: 回调
koa:
v1 generator
v2 过渡板 generator&async
v3 async/await
koa安装
1 | 1. |
路由
express 自带路由1
2server.get('/a')
server.post('/a')
koa 不带路由,需要用koa-router中间件
1 | //安装 |
嵌套路由
安装koa-router
格式:
/user
/company
/admin
/news
/sport
/woman
/cart
栗子:
新建一个路由主目录routers,里面有一个管理用户的路由目录user,里面建三个文件,admin,company,index,分别是管理员,企业,还有连接这两个路由的index
/node_modules
/routers
/user
admin.js
company.js
index.js
server.js
package.json
1 | //admin.js |
带参路由
还是嵌套路由里那几个页面。稍微对server.js进行一点修改
1 | const Koa = require('koa') |
用?id=xxx传参和/:id有什么区别?倾向于用/:id吗?
urlencoded http://aaa.com/user?a=12&b=5
顺序灵活 可省略 不利于SEO
params http://aaa.com/user/12/5
顺序死的 不可省略 利于SEO
ctx
先来了解一些server.context
server.context 相当于ctx的prototype
栗子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19const koa = require('koa')
const Router = require('koa-router')
let server = new koa()
server.listen(8080)
//在server.context里添加属性a=12
//server.context.a=12
//常见用法,一些公用的东西几乎都是往这个上面加
server.context.db = mysql.createPool()
let router = new Router
router.get('/news',async ctx=>{
//可以直接在ctx.a里拿到
//ctx.body = 'bbb'+ctx.a
//然后在这里拿到
console.log( ctx.db)
})
ctx
ctx.request,ctx.response
原始的request和response对象,一般用不到
信息:
ctx.method
请求方法
ctx.url
请求的具体地址
ctx.path
请求的路径部分,不包括域名,不包括query
ctx.query
get 数据
ctx.ip
客户端的ip
ctx.headers
请求头
方法:
ctx.throw(code,msg)
报错并且退出1
ctx.throw(400,'user and password is required')
ctx.assert(条件,code,msg)
断言,相当于封装了一下的throw1
2ctx.assert(ctx.query.user,400,'username is required')
ctx.assert(ctx.query.pass,400,'password is required')
ctx.state=305
状态码
ctx.redirect(‘’)
重定向,比如登录成功后重定向到某个页面
中间件
1.koa-static
安装:npm i koa-static -D1
2
3
4server.use(static('./static',{
maxage:86400*1000 ,//缓存,在这个时间内文件不会更新,可以降低服务器压力
index: '1.html' , //默认文件
}))
更多栗子:
1 | const Koa = require('koa') |
2.koa-better-body
安装 npm i koa-better-body -D
cookie
cookie是koa里自带的1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21const Koa = require('koa')
const Router = require('koa-router')
let server = new Koa()
server.listen(8080)
//如果要防篡改,要加签名
server.keys=[
'nsibsidbfndoiqdaioxchiosd',
'nsibsadzxctrgedwefercjiloi',
'sdscsdcbrvewecscfrhnuykiu',
]
server.use(async ctx=>{
ctx.cookies.set('user','cxn',{
maxAge:14*86400*1000,//有效期
signed:true , //是否签名
})
ctx.cookies.get('user',{
signed:true //如果设置的时候有签名,获取的时候也必须要有,否则可以获取到但是不会校验,这个cookie还是可以被更改的
})
})
session
安装 npm i koa-session -D
session强制签名
1 | const Koa = require('koa') |
数据库
安装 npm i mysql co-mysql -D1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24const Koa = require('koa')
const Router = require('koa-router')
const mysql = require('mysql')
const co = require('co-mysql')
let conn = mysql.createPool({
host:'localhost',
user:'root',
password:'123456',
database:'newCreate'
})
let db = co(conn)
let server = new Koa()
server.listen(8080)
server.context.db = db
server.use(async ctx=>{
let data = await ctx.db.query('SELECT * FROM user')
ctx.body=data
})
对上面这段做一个封装:
新建一个目录,libs,下面放一个文件database.js
database.js:1
2
3
4
5
6
7
8
9
10
11
12
13const mysql = require('mysql')
const co = require('co-mysql')
let conn = mysql.createPool({
host:'localhost',
user:'root',
password:'123456',
database:'newCreate'
})
let db = co(conn)
module.exports=db
server.js:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28const Koa = require('koa')
const Router = require('koa-router')
let server = new Koa()
server.listen(8080)
server.context.db = require('./libs/database')
//这是一个处理所有异步错误的偷懒办法,就不用在每个处理前写try,catch了
server.use(async (ctx,next)=>{
try{
await next()
}catch(e){
ctx.body='错了'
}
})
server.use(async ctx=>{
try{
let data=await ctx.db.query('SELECT * FROM user')
}catch(e){
ctx.throw(500,'database error')
}
ctx.body=data
})