Fastify如何实现公共私有路由分离 让指定插件仅作用于部分路由
问题原因
插件全局生效的核心是你使用了fastify-plugin(代码中的fp函数)包裹了业务路由插件。fastify-plugin的作用是打破Fastify的插件封装边界,将当前插件内注册的所有插件、装饰器都提升到父级作用域,因此你在 bookings 插件内注册的dbPlugin、authPlugin会全局生效,自然也会作用于/health接口。
解决方法
- 移除 bookings.ts 中对插件的
fp包裹,直接导出普通的FastifyPluginAsync函数即可,这样插件会保留独立作用域,内部注册的插件只会对当前插件下的路由生效。 - 你当前
await两个register执行的写法是正确的:register返回Promise,只有等待其执行完成后,插件注册的db等装饰器才会挂载到当前Fastify实例上,才能正常访问。 - 可选操作:如果需要给 bookings 模块下的所有路由统一加前缀,可以在注册路由插件时传入
prefix参数,更便于路由分组管理。
修改后代码
bookings.ts
// ... import type { FastifyPluginAsync } from 'fastify' // 移除fp包裹,直接导出插件 const plugin: FastifyPluginAsync = async api => { await Promise.all([ api.register(dbPlugin), api.register(authPlugin), ]) const {db, log} = api api.route<{Body:BookingRequestType,Reply:BookingType}>({ url: '/bookings', method: 'POST', async handler(req, res) { console.log('got user', req.user) } }) } export default plugin
可选:index.ts 注册路由时加统一前缀
// 所有 bookings 模块下的路由都会自动加上 /api 前缀 server.register(bookingsRoutes, { prefix: '/api' })
补充说明
仅当你开发的是需要全局生效的通用工具插件时,才需要用fastify-plugin包裹,普通业务路由插件不需要该操作,保持默认的封装隔离即可。
内容的提问来源于stack exchange,提问作者mpen
相关产品推荐
相关产品推荐

