在任意函数中使用 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())
})
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())
})