638 KOA2的使用:介绍,快速上手,中间件的特点,后台项目的开发
作者:互联网
1.KOA2的介绍
2.KOA2的快速上手
myApp.js
const Koa = require('koa');
const app = new Koa()
app.use((ctx, next) => {
console.log(ctx)
ctx.response.body = '哈哈哈'
})
app.listen(8000, () => console.log('服务器在8000端口启动成功~~'))
3.KOA2中间件的特点
app.js
// 1.创建koa对象
const Koa = require('koa')
const app = new Koa()
// 2.编写响应函数(中间件)
// ctx: 上下文, web容器, ctx.request ctx.response
// next: 下一个中间件, 下一层中间件是否能够得到执行, 取决于next这个函数有没有被调用
app.use((ctx, next) => {
console.log('第一层中间件...1')
ctx.response.body = '<h2>hello world</h2>'
next()
console.log('第一层中间件...2')
})
// 第二层中间件
app.use(async (ctx, next) => {
console.log('第二层中间件...1')
const ret = await next()
console.log(ret)
console.log('第二层中间件...2')
})
// 第三层中间件
app.use((ctx, next) => {
console.log('第三层中间件')
return 'i love the dog'
})
// 3.绑定端口号 3000
app.listen(3000, () => console.log('服务器在3000端口启动成功^-^'))
结果
服务器在3000端口启动成功^-^
第一层中间件...1
第二层中间件...1
第三层中间件
第一层中间件...2
i love the dog
第二层中间件...2
第一层中间件...1
第二层中间件...1
第三层中间件
第一层中间件...2
i love the dog
第二层中间件...2
总结:
- 1、不加async、await,next()的执行结果是一个promise对象。
- 2、执行到第一个next(),会暂停执行该中间件的代码,先去执行下一个 中间件的代码。
myApp.js
const Koa = require('koa');
const app = new Koa()
app.use((ctx, next) => {
ctx.response.body = '<h2>哈哈哈</h2>'
console.log('第一层中间件...1')
next()
console.log('第一层中间件...2')
})
app.use((ctx, next) => {
console.log('第2层中间件...1')
const res = next()
console.log('res---', res)
console.log('第2层中间件...2')
})
app.use((ctx, next) => {
console.log('第3层中间件...1')
return 'i love the dog'
})
app.listen(8000, () => console.log('服务器在8000端口启动成功~~'))
打印结果
服务器在8000端口启动成功~~
第一层中间件...1
第2层中间件...1
第3层中间件...1
res--- Promise { 'i love the dog' }
第2层中间件...2
第一层中间件...2
第一层中间件...1
第2层中间件...1
第3层中间件...1
res--- Promise { 'i love the dog' }
第2层中间件...2
第一层中间件...2
myApp.js
const Koa = require('koa');
const app = new Koa()
app.use((ctx, next) => {
ctx.response.body = '<h2>哈哈哈</h2>'
console.log('第一层中间件...1')
next()
console.log('第一层中间件...2')
})
app.use(async (ctx, next) => {
console.log('第2层中间件...1')
const res = await next()
console.log('res---', res)
console.log('第2层中间件...2')
})
app.use((ctx, next) => {
console.log('第3层中间件...1')
return 'i love the dog'
})
app.listen(8000, () => console.log('服务器在8000端口启动成功~~'))
打印结果
服务器在8000端口启动成功~~
第一层中间件...1
第2层中间件...1
第3层中间件...1
第一层中间件...2
res--- i love the dog
第2层中间件...2
第一层中间件...1
第2层中间件...1
第3层中间件...1
第一层中间件...2
res--- i love the dog
第2层中间件...2
4.后台项目的开发
app.js
// 服务器的入口文件
// 1.创建KOA的实例对象
const Koa = require('koa')
const app = new Koa()
const respDurationMiddleware = require('./middleware/koa_response_duration')
const respHeaderMiddleware = require('./middleware/koa_response_header')
const respDataMiddleware = require('./middleware/koa_response_data')
// 2.绑定中间件
// 绑定第一层中间件
app.use(respDurationMiddleware)
// 绑定第二层中间件
app.use(respHeaderMiddleware)
// 绑定第三层中间件
app.use(respDataMiddleware)
// 3.绑定端口号 8888
app.listen(8888, () => console.log(`服务器在8888端口启动成功~~`))
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) {
// 读取文件失败
reject(error)
} else {
// 读取文件成功
resolve(data)
}
})
})
}
koa_response_duration.js
// 计算服务器消耗时长的中间件
module.exports = async (ctx, next) => {
// 记录开始时间 【Date.now()得到的是时间戳,和+new Date()一样。】
const start = Date.now()
// 让内层中间件得到执行
await next()
// 记录结束的时间
const end = Date.now()
const duration = end - start
// ctx.set 设置响应头 X-Response-Time 【不要漏了加 ms。】
ctx.set('X-Response-Time', duration + 'ms')
}
koa_response_header.js
// 设置响应头的中间件
module.exports = async (ctx, next) => {
const contentType = 'application/json; charset=utf-8'
// 【参数:key、value】
ctx.set('Content-Type', contentType)
ctx.set("Access-Control-Allow-Origin", "*")
ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE")
await next()
}
koa_response_data.js
// 处理业务逻辑的中间件,读取某个json文件的数据
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
filePath = path.join(__dirname, filePath)
console.log(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)
}
await next()
}
标签:...,const,638,ctx,中间件,next,KOA2,console 来源: https://www.cnblogs.com/jianjie/p/14449333.html