文件目录
schema/index.js
const Ajv = require("ajv")
const fs = require('fs')
const ajv = new Ajv()
// 读取Schema json
function readSchema (url) {
return new Promise((resolve, reject) => {
const filePath = `./schema/schemaFile/${ url.split('?')[0].split('/').reverse()[0] }.json`
fs.readFile(filePath, function (err, data) {
if (err) {
resolve('error')
} else {
resolve(data)
}
})
})
}
// 校验中间件
function jsonSchemaValidate () {
return async (ctx, next) => {
const { url, method } = ctx
let requestParams
if (method === 'GET') {
requestParams = ctx.request.queryString || ctx.request.query
}
if (method === 'POST') {
requestParams = ctx.request.body
}
// schema 统一放在一个文件夹下面
// 文件路径与请求的名字一致
const schema = await readSchema(url)
const validate = ajv.compile(JSON.parse(schema))
const valid = validate(requestParams)
if (!valid) {
ctx.body = validate.errors
} else {
await next()
}
}
}
module.exports = {
jsonSchemaValidate
}
app.js
const Koa = require('koa')
const app = new Koa()
const index = require('./routes/index')
const bodyParser = require('koa-bodyparser')
const validate = require('../jsonSchema/schema/index')
// 中间件1
app.use(bodyParser())
// 中间件2
app.use(validate.jsonSchemaValidate())
// 中间件3
app.use(index.routes(), index.allowedMethods())
app.listen(3000, () => {
console.log('server is running at 3000')
})
router.js
在到达请求之前会执行中间件
const fs = require('fs')
// 引入自调用
const router = require('koa-router')()
// 封装一个ajv校验的函数
const validate = require('../schema/index')
router.get('/metrics/getData', async (ctx, next) => {
ctx.body = '校验成功~'
})
module.exports = router
schemaFile/getData.json
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"required": ["foo"],
"additionalProperties": false
}