在任意函数中使用 fastify json 模式验证

Use fastify json schema validation in arbitrary functions

Fastify 有一些非常棒的 json 模式支持。 (Link)

但是,我现在也想在我的业务逻辑中使用我通过 fastify.addSchema(..) 添加的模式。例如(伪代码):

schema = fastify.getSchema("schema1")
if (schema.validate(data)) {
  console.log("ok");
} else {
  console.log("not ok");
}

我怎样才能做到这一点?

现在,在 Fastify 中,一个路由有一组验证函数。 这些函数存在只是因为你在 { schema: {} } 路由中设置了它们 配置。

因此,首先,如果您不在路由中设置这些模式,您将无法访问它们。 getSchema 函数检索 架构对象 ,而不是 编译函数 。 关系不是 1:1,因为验证函数可以通过 $ref 关键字使用更多模式。

归档所需内容的唯一方法是对内部 Fastify 进行猴子修补(强烈建议不要这样做) 或者打开项目的功能请求。

这是一个示例,如您所见,您只能在路由上下文中获取路由的验证函数。 所以,它远不是一个灵活的用法。

const fastify = require('fastify')({ logger: true })

const {
  kSchemaBody: bodySchema
} = require('fastify/lib/symbols')


fastify.post('/', {
  schema: {
    body: {
      $id: '#schema1',
      type: 'object',
      properties: {
        bar: { type: 'number' }
      }
    }
  }
}, async (request, reply) => {
  const schemaValidator = request.context[bodySchema]
  const result = schemaValidator({ bar: 'not a number' })
  if (result) {
    return true
  }
  return schemaValidator.errors
})

fastify.inject({
  method: 'POST',
  url: '/',
  payload: {
    bar: 33
  }
}, (err, res) => {
  console.log(res.json())
})