nodejs 已经是前端通往全栈的必经之路,美好的一天就是代码一篇又一篇
今天学习一下koa及koa周边
1丶什么是Koa
简单来说KoaJS是基于NodeJs的Web开发框架使用原生node开发亦不是不可,但是相对于来说非常复杂,koa给我们简化了很多,举个例子
利用原生node起一个http服务
const http = require('http') //引用内置的http模块
const server = http.createServer((req,res)=>{
res.end('hello NodeJs') //两种不同的写法
// res.write('hello NodeJs')
// res.end()
})
server.listen(8000)
koa如何启动一个http服务?
const koa = require('koa'); //约定俗成 开头字母要大写
const app = new Koa(); //实例化koa
app.use((ctx)=>{
ctx.body = "hello NodeJs"
})
app.listen(8000)
1.原生的req,res哪里去了?
调用ctx.req/ctx.res 就相当于原生的req,res
2.ctx.request/ctx.response 对原生的req,res做了一下封装
koa中的next() 先说一下大致意思 跳过当前执行的内容,执行下一项,当下一项执行完毕再返回来继续执行,举个例子
const koa = require('koa');
const app = new Koa();
app.use((ctx,next)=>{
console.log("first start >>")
next()
console.log("first end >>")
})
app.use((ctx,next)=>{
console.log("second start >>")
next()
console.log("second end >>")
})
app.use((ctx,next)=>{
console.log("third start >>")
next()
console.log("third end >>")
})
app.listen(8000)
打印的结果如下
first start >>
second start >>
third start >>
third end >>
second end >>
first end >>
发现了什么? 是不是特别像洋葱模型 一层一层进来再出去
2丶koa 之 koa-router
路由大家并不陌生,先看一下koa-router和原生的对比
原生获取路由
const http = require('http')
const server = http.createServer((req,res)=>{
//首先需要知道什么事req.url
//我们可以通过req.url获取到路径,再根据路径去做判断
if(req.url === '/'){
res.end("index")
}else if(req.url === '/detail'){
res.end('detail')
}else{
......
}
})
server.listen(8000)
koa-router 获取路由
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
router.redirect('/','/home') //重定向 会自动帮我们跳转到/home
router.get('/home',(ctx)=>{
ctx.body="router home"
})
router.get('/detail',(ctx)=>{
ctx.body="router detail"
})
app.use(Router.routes)
app.listen(8000)
优点在于我们省去了一些判断的步骤,而且代码看起开也干净整洁一些
在koa-router 获取参数
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
// 两种形式的路径
//访问的是 localhost:8000/detail?id=10
router.get('/detail',(ctx)=>{
const {id} = ctx.query
ctx.body=`query id:${id}`
})
//访问的是 localhost:8000/detail/10
router.get('/detail/:id',(ctx)=>{
const {id} = ctx.params
ctx.body=`params id:${id}`
})
app.use(Router.routes)
app.listen(8000)
都能获取相应的数据,小伙伴们自己尝试一下!
3丶利用koa进行接口设计
接口设计之前,我们先来了解一下 RESTful 设计理念
RESTful(表现层状态转化)
1.资源:网络上的一个实体 如:一段文字,一张图片,一个服务,一首歌等
独特的标识 URI
2.表现层:把资源呈现出来的方式(content-type 定义资源的方式)
3.状态转化:前提 http协议(无状态协议)客户端想要操纵服务器,必须使服务器状态发生改变
get/post/delete/put
小案例 带大家看一下RESTful形式的接口设计
实现一个对用户列表的增删改查
const Koa = require('koa')
const Router = require('koa-router')
const KoaBody = require('koa-body') //借助koa-body获取信息
const app = new Koa();
const router = new Router()
app.use(KoaBody())
const users = [
{
id:1,
name:"太阳",
age:100
},{
id:2,
name:"月亮",
age:100
}
]
//查询一个用户
router.get('/users/:id',(ctx)=>{
const {id} = ctx.params
const user = users.find((item)=>item.id == id)
if(!user){
ctx.throw(404,"此用户不存在")
}
ctx.body = user
})
//新增一个用户
router.post('/users/:id',(ctx)=>{
const {id} = ctx.params
const {name,age} = ctx.request.body //信息存在这里
const user = {
id,
name,
age
}
users.push(user)
ctx.body = user
})
//修改用户信息
router.put('/users/:id',(ctx)=>{
const {id} = ctx.params
const {name,age} = ctx.request.body
const user = users.find((item)=>item.id == id)
if(name){
user.name = name
}
if(age){
user.age = age
}
ctx.body = user
})
//删除用户
router.del('/users/:id',(ctx)=>{
const {id} = ctx.params
users = users.filter((item) => item.id != id)
ctx.body = "ok"
})
app.use(router.routes())
app.listen(8888)