(三)抽离koa中 json schema校验中间件

文件目录

 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
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值