Fastify响应Schema验证问题:字符串响应未触发校验报错
解决Fastify响应Schema对字符串不触发校验的问题
问题核心:Fastify的响应Schema默认和content-type绑定——你定义的默认Schema是针对application/json类型响应的。当调用send("something")时,Fastify会自动把响应的content-type设为text/plain,此时不会应用你写的object类型Schema做校验,所以没触发错误。
下面提供两种解决思路:
方案一:强制所有响应为JSON格式
如果你的接口只允许返回JSON响应,发送字符串时要包装成JSON对象,比如:
response.status(201).send({ message: "something" })
这样会自动触发application/json类型的Schema校验,不符合规则时就会报错。
要是想避免不小心发送非JSON响应,可以加个钩子拦截:
fastify.addHook('onSend', async (request, reply, payload) => { if (reply.getHeader('content-type') !== 'application/json') { throw new Error('仅允许返回JSON格式响应') } })
方案二:修改Schema适配所有响应类型
如果需要允许非JSON响应,但希望不符合预期的响应(比如字符串)触发校验错误,可以给Schema加上contentType: '*/*',让Fastify对所有类型的响应都应用该Schema校验:
response:{ default:{ contentType: '*/*', type:'object', properties:{ status:{type:"boolean"}, message:{type:"string"}, data:{type:"object"} }, required:['status','message'], additionalProperties: false, } }
这样发送字符串响应时,因为不符合object类型的Schema,就会触发校验错误。
另外确认下你的Fastify实例开启了响应校验(默认是开启的,若手动关闭过,初始化时要打开):
const fastify = require('fastify')({ responseValidation: true })
内容的提问来源于stack exchange,提问作者Siddhesh Khadapkar
相关产品推荐
相关产品推荐

