Fastify注册路由文件时应用崩溃的原因排查求助
Fastify注册路由时崩溃的原因及解决办法
错误原因
你调用app.register时传入的第一个参数是import("./Routes/UserRoutes.js"),这会返回一个Promise对象,但Fastify的register方法要求第一个参数必须是符合规范的插件函数。Fastify内部在检查插件健康状态时,无法从Promise对象上读取预期的属性,因此抛出Cannot read properties of undefined (reading 'name')错误。
解决方法
方法1:使用顶层await(Node.js 14.8+支持)
在支持顶层await的环境中,先等待模块加载完成,再取出导出的函数传入register:
await app.register( (await import("./Routes/UserRoutes.js")).userRoutes, { prefix: '/user' } )
方法2:用.then()处理Promise
如果无法使用顶层await,通过Promise的then方法处理模块加载:
import("./Routes/UserRoutes.js").then(module => { app.register(module.userRoutes, { prefix: '/user' }) }).catch(err => { console.error('路由模块加载失败:', err) })
优化写法:改为默认导出
可以修改UserRoutes.js的导出方式,让代码更简洁:
// UserRoutes.js export default async function userRoutes(fastify) { fastify.get('/fast', function (request, reply) { reply.code(200).send({ hello: 'world' }) }) }
此时注册代码可简化为:
// 顶层await版本 await app.register(await import("./Routes/UserRoutes.js"), { prefix: '/user' }) // Promise.then版本 import("./Routes/UserRoutes.js").then(module => { app.register(module.default, { prefix: '/user' }) })
内容的提问来源于stack exchange,提问作者Marvix
相关产品推荐
相关产品推荐

