nodejs koa

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值