Fastify响应XML的惯用写法?如何优化重复代码实现DRY?
Fastify XML响应代码复用方案
Fastify提供了几种惯用方式来避免重复编写XML响应的代码,遵循DRY原则,下面是具体实现:
1. 装饰reply对象,添加自定义方法
给reply装饰一个sendXml方法,直接在路由里调用就能完成类型设置和XML转换:
// 在Fastify实例初始化后注册装饰器 fastify.decorateReply('sendXml', async function (obj) { await this.type('application/xml').send(obj.toXmlString()); });
之后在任意路由里,只需一行代码即可返回XML响应:
reply.sendXml(someObject);
2. 使用onSend钩子批量处理
如果你的XML响应路由有统一标识,可以通过路由配置标记,再用全局钩子自动处理:
// 注册全局onSend钩子 fastify.addHook('onSend', async (request, reply, payload) => { // 检查当前路由是否标记为需要XML响应 if (reply.context.config.xmlResponse && typeof payload === 'object') { reply.type('application/xml'); return payload.toXmlString(); } return payload; });
定义路由时添加标记:
fastify.get('/user/profile', { config: { xmlResponse: true } }, async (request, reply) => { // 直接返回对象,钩子会自动转为XML并设置响应类型 return userProfileObject; });
3. 自定义响应序列化器
利用Fastify的序列化器机制,针对application/xml类型设置全局序列化逻辑:
// 注册XML类型的序列化器 fastify.addSerializer('application/xml', (payload) => { return payload.toXmlString(); });
之后在路由里只需指定响应类型并发送对象,序列化器会自动处理转换:
await reply.type('application/xml').send(someObject);
内容的提问来源于stack exchange,提问作者Caleb St-Denis
相关产品推荐
相关产品推荐

