Fastify报错:Plugin必须为函数或Promise,接收到object类型
问题解决:AvvioError [AVV_ERR_PLUGIN_NOT_VALID]
你遇到的这个错误本质是Fastify的register方法仅接受函数/返回Promise的函数作为插件,但你传入的是一个普通对象(router),不符合插件的格式要求。以下是两种直接有效的解决方式:
方式一:将路由对象转为Fastify插件函数
修改/src/routes/index.js,把导出的对象改成标准的Fastify插件函数:
import { healthCheck } from '../controllers/healthCheckController.js'; // 改为插件函数,参数为fastify实例和配置选项 export default async function routes(fastify, options) { // 注册health-check路由 fastify.route({ method: 'GET', url: '/health-check', handler: async (request, reply) => { return healthCheck(request, reply); } }); // 其他路由可在此继续用fastify.route添加 }
修改后,入口文件的fastify.register(router, { prefix: '/api/v1' })就能正常工作,因为router现在是符合要求的插件函数。
方式二:直接遍历路由对象注册(适合简单场景)
如果不想修改路由文件结构,可在入口文件中手动遍历路由对象,用fastify.route逐个注册:
import Fastify from 'fastify'; const fastify = Fastify({ logger: true, }); import routes from './src/routes/index.js'; // 遍历路由对象,拼接前缀后注册 for (const [url, routeConfig] of Object.entries(routes)) { fastify.route({ url: `/api/v1${url}`, ...routeConfig }); } try { await fastify.listen({ port: 4000 }); } catch (err) { fastify.log.error(err); process.exit(1); }
这种方式无需改动路由文件,直接在入口完成路由注册,适合路由数量较少的场景。
内容的提问来源于stack exchange,提问作者Not A Robot
相关产品推荐
相关产品推荐

