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)
}
})
})
}