You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:07:11