中间件
oneQL 基于koa,所以中间件和koa的洋葱圈 是一致的。
编写oneQL中间件
项目根目录下的middle文件夹下建一个middleware文件
middleware/
├── startTime.ts
└── suffix.ts
例如统计graphql服务响应时长
// startTime.ts
module.exports = async (ctx, next) => {
let startTime = Date.now()
console.log('startTime ', startTime , ctx.req.url)
await next()
let endTime = Date.now()
console.log('endTime ', endTime , ' spend time ', (endTime - startTime) , ctx.req.url)
}
配置
- 因为oneQL内部默认也有使用中间件, 所以分开了内部中间件 时序前 和内部中间件时序后 2个时序配置控制。
- 每个中间件配置是一个数组,数组顺序为中间件执行时序。
- options 为中间件自定义参数。
middleWare: [{
name: 'startTime',
options: { // 可选
disable: false // 是否开启中间件,默认 false
}
}]
事例
// app.config.js
middleWare: [{
name: 'startTime',
options: { // 可选
disable: false // 是否开启中间件,默认 false
}
}],
middleWareAfter: [{ // oneQL内置中间件之后执行
name: 'suffix'
}]
// middle/startTime.ts
module.exports = async (ctx, next) => {
let startTime = Date.now()
console.log('startTime ', startTime , ctx.req.url)
await next()
let endTime = Date.now()
console.log('endTime ', endTime , ' spend time ', (endTime - startTime) , ctx.req.url)
}
// middle/suffix.ts
module.exports = async (ctx, next) => {
ctx.suffix = 'suffix middle'
console.log('after suffix middle ----')
await next()
console.log('after suffix middle ---- after next()')
}
控制台输出结果
startTime 1554727961097 /graphql
after suffix middle ----
context city --- suffix middle
city param - { key: 'D', ext: [ { key: '2', value: '1' } ] }
after suffix middle ---- after next()
endTime 1554727961127 spend time 30 /graphql