Koa2学习

Koa2是什么

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

Koa2安装

Koa 依赖 node v7.6.0 或 ES2015及更高版本和 async 方法支持,node -v检查nodejs版本

npm init -y (快速在当前文件夹创建package.json维护第三方包信息)
npm install koa 下载Koa2

Koa2简单使用

创建并编写app.js文件

//1.创建koa对象
const Koa = require('koa')
const app = new Koa() 
//2.编写响应函数(中间件)
// ctx:上下文,web容器,ctx.request(请求对象) ctx.response(响应对象)
// nex :下一个中间件,下一个中间件能否能够得到执行,取决于next整个函数有没有被调用
app.use((ctx,next)=>{
    ctx.response.body = 'hello world66'
})
// 监听端口号
app.listen(3000)

koa2中间件的特点

1.Koa对象通过use加入一个中间件
2.一个中间件就是一个函数
3.中间件的执行顺序符合洋葱模型
在这里插入图片描述

4.内层中间件能否执行取决于外层中间件的next函数是否调用
5.调用next函数得到的是Promise对象

demo实例

//1.创建koa对象
const Koa = require('koa')
const app = new Koa() 
//2.编写响应函数(中间件)
// ctx:上下文,web容器,ctx.request(请求对象) ctx.response(响应对象)
// nex :下一个中间件,下一个中间件能否能够得到执行,取决于next整个函数有没有被调用
app.use((ctx,next)=>{
    console.log('第一层中间件..1');
    ctx.response.body = 'hello world66'
    next()
    console.log('第一层中间件..2');
})
// 第二层中间件
app.use((ctx,next)=>{
    console.log('第二层中间件..1');
    next()
    console.log('第二层中间件..2');

})
// 第三层中间件
app.use((ctx,next)=>{
    console.log('第三层中间件');

})
// 绑定端口号
app.listen(3000)

node app.js执行
访问http://localhost:3000/ 控制台打印
在这里插入图片描述

Koa2实例

在这里插入图片描述
app.js

// 服务器的入口文件
// 1.创建koa的实例对象
const koa = require('koa')
const app = new koa()
// 2.绑定中间件
// 绑定第一层中间件 计算服务器消耗时长的中间件
const respDurationMiddleware =  require('./middleware/koa_response_duration')
app.use(respDurationMiddleware)

// 绑定第二层中间件 设置响应头的中间件
const respHeaderMiddleware = require('./middleware/koa_response_header')
app.use(respHeaderMiddleware)

// 绑定第三层中间件 处理业务逻辑的中间件
const respDataMiddleware = require('./middleware/koa_response_data')
app.use(respDataMiddleware)

// 绑定一个端口号
app.listen(8080)

middleware>koa_response_duration.js

// 计算服务器消耗时长的中间件
// 1.位于第一层中间件
// 2.计算执行事件
    // -一进入时记录开始时间
    // 其他所有中间件执行完后记录结束时间,两者相减
// 3.设置响应头
// X-Response-Time:5ms

// 导出
module.exports =async (ctx,next) =>{
    // 记录开始的时间
    const start = Date.now()
    // 让内层中间件执行
    await next()
    // 记录结束的时间
    const end = Date.now()
    // 设置响应头X-Response-Time
    const duration = end - start
    // ctx.set 设置响应头
    ctx.set('X-Response-Time',duration + 'ms' )

}

middleware>koa_response_header.js

// 设置响应头的中间件
// 第2层中间件
// 获取mime类型 application/json
// 设置响应头
module.exports = async (ctx,next)=>{
    const contentType = 'application/json;charset=utf-8'
    ctx.set('Content-Type',contentType)

    // 允许跨域
    ctx.set("Access-Control-Allow-Origin","*"),
    ctx.set("Access-Control-Allow-Methods","OPTIONS,GET,PUT,POST,DELETE")
    // ctx.response.body = '{"success":true}'
    await next()
}

middleware>koa_response_data.js

//处理业务逻辑的中间件
// 读取文件内容
    // 获取请求的路径,拼接文件路径
    //读取该路径对应文件的内容
// 设置响应体
// ctx.response.body
const path = require('path')
const fileUtils = require('../utils/file_utils')
module.exports = async (ctx,next) =>{
// 根据url
const url =  ctx.request.url // /api/seller     ../data/seller.json
let filePath = url.replace('/api','') //  /seller
filePath = '../data' +filePath + '.json' // ../data/seller.json
// __dirname当前文件所处的绝对路径, 拼接
filePath = path.join(__dirname,filePath)
try{
    // 成功
    const ret =await fileUtils.getFileJsonData(filePath)
    ctx.response.body = ret
}catch(error){
    const errorMsg = {
        message:'读取文件内容失败,文件资源不存在',
        status:404
    }
ctx.response.body = JSON.stringify(errorMsg)

}

console.log(filePath);

    await next()
}

utils>file_utils.js

// 读取文件的工具方法
const fs = require('fs')
module.exports.getFileJsonData = (filePath) =>{
//    根据文件的路径,读取文件的内容

return new Promise((resolve,reject)=>{
fs.readFile(filePath,'utf-8',(error,data)=>{
    if(error){
        // console.log('读取文件失败');
        reject(error)
    }else{
        // 读取文件成功
        resolve(data)
    }
})
})

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值