当前位置: 首页 > news >正文

利用golang embed特性嵌入前端资源问题解决

embed嵌入前端资源,配置前端路由的代码如下

func StartHttpService(port string, assetsFs embed.FS) error {//r := gin.Default()gin.SetMode(gin.ReleaseMode)r := gin.New()r.Use(CORSMiddleware())// 静态文件服务dist, err := fs.Sub(assetsFs, "assets/dist")if err != nil {return fmt.Errorf("无法加载静态文件: %v", err)}r.StaticFS("/", http.FS(dist))// API路由r.Any("/api/service", handler.ServiceControlsHandler)r.Any("/api/service/config", handler.ServiceConfigsHandler)// 处理前端路由r.NoRoute(func(c *gin.Context) {c.FileFromFS("index.html", http.FS(dist))})go func() {common.Logger.Info(fmt.Sprintf("Web服务正在启动,监听端口 :%s", port))err := r.Run(":" + port)if err != nil {common.Logger.Error(fmt.Sprintf("http service start error: %v", err))} else {common.Logger.Info("http service start success")}}()return nil
}

运行后报错

panic: '/api/service' in new path '/api/service' conflicts with existing wildcard '/*filepath' in existing prefix '/*filepath'

问题解决步骤:

  1. 分析错误原因
    在Gin框架中,路由注册顺序和路径模式会导致冲突。当前代码在注册/api/service路由时,与之前注册的通配符路由/*filepath发生冲突。Gin不允许在同一个路径前缀上注册多个处理函数。
  2. 确定解决方案
    为了解决路由冲突问题,需要调整前端路由的基路径:
  • 将根路径/重定向到/admin
  • 修改前端构建配置,将静态资源的基路径设为/admin
  1. 修改Golang代码
    StartHttpService函数中:
- 添加根路径重定向:```gor.GET("/", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "admin/")})
  • 修改静态文件服务路径:
r.StaticFS("/admin", http.FS(dist))
  1. 修改前端配置
    vite.config.js中添加base配置:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({plugins: [vue()],base: '/admin/',
})
  1. 重新构建前端资源
    执行npm run build生成新的静态资源,并确保生成的文件与/admin路径匹配。
  2. 验证生效
    重新启动服务后:
  • 访问根路径/会自动跳转到/admin
  • 前端路由和API路由将正常工作,不会有路径冲突
    此方案通过调整路由结构和前端配置,解决了Gin框架中的路由冲突问题,同时保持了前端应用的正常功能。
http://www.lryc.cn/news/547041.html

相关文章:

  • SPI驱动(二) -- SPI驱动程序模型
  • 【无标题】FrmImport
  • 深入浅出 Go 语言:协程(Goroutine)详解
  • vLLM代码推理Qwen2-VL多模态
  • DNS云解析有什么独特之处?
  • 视频流畅播放相关因素
  • Python实现一个类似MybatisPlus的简易SQL注解
  • linux一些使用技巧
  • 小模型和小数据可以实现AGI吗
  • io学习----->文件io
  • kubernetes介绍
  • 如何高效准备PostgreSQL认证考试?
  • 如何使用Briefing打造私有视频会议系统结合内网穿透异地远程连接
  • XHR请求解密:抓取动态生成数据的方法
  • 坐标变换介绍与机器人九点标定的原理
  • 串口调试助手Alien v5.198新版发布
  • 解锁Android RemoteViews:跨进程UI更新的奥秘
  • 编译可以在Android手机上运行的ffmpeg程序
  • Verilog学习方法—基础入门篇(一)
  • 本地jar包添加到 maven
  • C# Unity 唐老狮 No.6 模拟面试题
  • 项目工坊 | Python驱动淘宝信息爬虫
  • Java8-Stream流介绍和使用案例
  • setlocale()的参数,“zh_CN.UTF-8“, “chs“, “chinese-simplified“的差异。
  • docker 安装达梦数据库(离线)
  • FastGPT 引申:如何基于 LLM 判断知识库的好坏
  • 关于2023新版PyCharm的使用
  • Leetcode 112: 路径总和
  • 华为云IAM 用户名和IAM ID
  • Compose Multiplatform+Kotlin Multiplatfrom 第四弹跨平台