目录
koa框架
Koa
是⼀个新的
web
框架,由
Express
幕后的原班⼈⻢打造, 致⼒于成为web 应⽤和
API
开发领域中的⼀个更⼩、更富有表现⼒、更健壮的基⽯。koa通过利用async函数,丢弃了回调函数,增强了错误处理能力。
安装:
npm i koa -S
快速搭建:
const koa = reauire('koa');
const app = new koa();
app.use(async ctx => {
ctx.body = 'Hello World';
})
app.listen(3000);
处理异步:
const Koa = require('koa')
const app = new Koa()
app.use(async (ctx, next) => {
// 对请求做处理
console.log('老弟来了~~')
await next() // 分割线
const rt = ctx.response.get('X-Response-Time')
console.log(`...${ctx.method} ${ctx.url} - ${rt}`)//GET / - ms
console.log('老弟离开了~~')
console.log(ctx);
})
app.use(async (ctx, next) => {
const start = Date.now()
console.log('嗯,我来了')
await next()
console.log('嗯,我走了')
const ms = Date.now() - start
ctx.set('X-Response-Time', `${ms}ms`)
})
// koa的中间件
app.use(async (ctx, next) => {
console.log('吃完饭,准备走了')
ctx.body = 'kiki' //设置响应体`
console.log('打印body')
})
app.listen(5000, () => {
console.log('5000端口被监听了~~')
})
运行:
错误中间件
const Koa = require('koa')
const app = new Koa()
// 错误处理中间
app.use(async (ctx, next) => {
try {
await next()
} catch (error) {
const { status, data, message } = error
// switch
ctx.status = status || 500
ctx.type = 'json'
ctx.body = { code: status, message, data }
// 手动触发全局的错误函数
ctx.app.emit('error', error, ctx)
}
})
// koa的中间件
app.use(async (ctx, next) => {
// ctx.throw()相当于是一个中间件
ctx.throw(401, '未授权', { data: '你瞅瞅' })
})
app.use(async (ctx) => {
ctx.body = '错误处理中间件'
})
// 全局的事件监听器
app.on('error', (err) => {
console.log('全局错误处理:', err.message, err.status, err.data)
})
app.listen(5001, () => {
console.log('5001端口被监听了~~')
})
运行:
创建全局的error处理
使用koa-log4是koa的一个处理日志的中间件,此模块可以帮助你按照你配置的规则分叉日志消息
- 在根目录下新建logger/目录
- 在logger/目录下新建logs/目录,用来存放日志文件
- 在logger/目录下新建index.js文件
logger/index.js
const path = require('path')
const log4js = require('koa-log4')
log4js.configure({
appenders: {
// 访问级别
access: {
type: 'dateFile',
// 生成文件的规则
pattern: '-yyyy-MM-dd.log',
// 文件名始终以日期区分
alwaysIncludePattern: true,
encoding: 'utf-8',
// 生成文件路径和文件名
filename: path.join(__dirname, 'logs', 'access')
},
application: {
type: 'dateFile',
pattern: '-yyyy-MM-dd.log',
alwaysIncludePattern: true,
encoding: 'utf-8',
filename: path.join(__dirname, 'logs', 'application')
},
out: {
type: 'console'
}
},
categories: {
default: { appenders: ['out'], level: 'info' },
access: { appenders: ['access'], level: 'info' },
application: { appenders: ['application'], level: 'WARN' }
}
})
module.exports = {
// 记录所有访问级别的日志
accessLogger: () => log4js.koaLogger(log4js.getLogger('access')),
// 记录所有应用级别的日志
logger: log4js.getLogger('application')
}
onerror.js
const Koa = require('koa')
const onerror = require('koa-onerror')
const { accessLogger, logger } = require('./logger')
const app = new Koa()