En lugar de pasar la fastify instance a cada función, ¿cómo puedo pasarla a un nivel superior solo una vez para que esté disponible para todas las funciones en el controlador?
// route file import { FastifyPluginAsync } from 'fastify' import RootController from '../root.controller' const root: FastifyPluginAsync = async (fastify, opts): Promise<void> => { fastify.get('/', RootController.index(fastify)) fastify.get('/show', RootController.show(fastify)) } export default root // controller file import { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify' export default { index: (fastify: FastifyInstance) => async (request: FastifyRequest, reply: FastifyReply) => { const hugs = fastify.someSupport() reply.send({ status: 'ok', love: hugs }) }, show: (fastify: FastifyInstance) => async (request: FastifyRequest, reply: FastifyReply) => { const hugs = 'extra ' + fastify.someSupport() reply.send({ status: 'ok', love: hugs }) } }La respuesta es una simple refactorización mecánica usando cierres:
// controller file import { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify' export default async function installRootController(fastify: FastifyInstance, opts): Promise<void> { fastify.get('/', async (request: FastifyRequest, reply: FastifyReply) => { const hugs = fastify.someSupport() reply.send({ status: 'ok', love: hugs }) }); fastify.get('/show', async (request: FastifyRequest, reply: FastifyReply) => { const hugs = 'extra ' + fastify.someSupport() reply.send({ status: 'ok', love: hugs }) }); }; Las funciones internas (los controladores asíncronos para / y /show ) tienen acceso a fastify porque es accesible desde el alcance léxico de la función circundante. Esto le permite encapsular "controladores" completos como complementos Fastify, listos para instalar así:
fastify.register(installRootController);Tenga en cuenta que el archivo "rutas" ahora no tiene ningún uso.