🤔 常见问题解答
我应该如何构建我的应用程序?
这个问题没有明确的答案。答案取决于应用程序的规模和参与的团队。为了尽可能灵活,Fiber 在结构方面没有做出任何假设。
路由和其他特定于应用程序的逻辑可以放在任意数量的文件中,采用你喜欢的任何目录结构。查看以下示例以获得灵感
- gofiber/boilerplate
- thomasvvugt/fiber-boilerplate
- Youtube - 使用 Gorm 和 Fiber 构建 REST API
- embedmode/fiberseed
我如何处理自定义 404 响应?
如果你使用的是 v2.32.0 或更高版本,你只需实现一个自定义错误处理程序即可。请参见下文,或在 错误处理 中查看更详细的说明。
如果你使用的是 v2.31.0 或更早版本,错误处理程序将不会捕获 404 错误。相反,你需要在堆栈的最底部(所有其他函数的下方)添加一个中间件函数来处理 404 响应
app.Use(func(c *fiber.Ctx) error {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
如何使用实时重新加载?
Air 是一款便捷的工具,每当源代码发生更改时,它都会自动重启你的 Go 应用程序,从而使你的开发过程更快、更有效率。
要在 Fiber 项目中使用 Air,请按照以下步骤操作
- 通过从 GitHub 发布页面下载适用于你操作系统的相应二进制文件或直接从源代码构建该工具来安装 Air。
- 在你的项目目录中为 Air 创建一个配置文件。此文件可以命名为 .air.toml 或 air.conf。以下是一个与 Fiber 配合使用的示例配置文件
# .air.toml
root = "."
tmp_dir = "tmp"
[build]
cmd = "go build -o ./tmp/main ."
bin = "./tmp/main"
delay = 1000 # ms
exclude_dir = ["assets", "tmp", "vendor"]
include_ext = ["go", "tpl", "tmpl", "html"]
exclude_regex = ["_test\\.go"]
- 使用 Air 启动你的 Fiber 应用程序,在终端中运行以下命令
air
当你对源代码进行更改时,Air 会检测到它们并自动重启应用程序。
可以在 Fiber Recipes 存储库 中找到一个演示如何将 Air 与 Fiber 配合使用的完整示例。此示例展示了如何在 Fiber 项目中配置和使用 Air 以创建高效的开发环境。
如何设置错误处理程序?
要覆盖默认错误处理程序,你可以在初始化新的 Fiber 实例 时提供 Config 时覆盖默认值。
app := fiber.New(fiber.Config{
ErrorHandler: func(c *fiber.Ctx, err error) error {
return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
},
})
我们有一个专门的页面来解释 Fiber 中的错误处理是如何工作的,请参阅 错误处理。
Fiber 支持哪些模板引擎?
Fiber 目前在我们的 gofiber/template 中间件中支持 9 个模板引擎
要详细了解如何在 Fiber 中使用模板,请参阅 模板。
Fiber 是否有社区聊天?
是的,我们有自己的 Discord 服务器,我们常在那里闲逛。我们针对每个主题都有不同的房间。
如果您有疑问或只是想聊天,请随时通过这个 > 邀请链接 < 加入我们。
fiber 是否支持子域路由?
是的,我们支持,以下是一些示例:此示例适用于 v2
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
)
type Host struct {
Fiber *fiber.App
}
func main() {
// Hosts
hosts := map[string]*Host{}
//-----
// API
//-----
api := fiber.New()
api.Use(logger.New(logger.Config{
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
}))
hosts["api.localhost:3000"] = &Host{api}
api.Get("/", func(c *fiber.Ctx) error {
return c.SendString("API")
})
//------
// Blog
//------
blog := fiber.New()
blog.Use(logger.New(logger.Config{
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
}))
hosts["blog.localhost:3000"] = &Host{blog}
blog.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Blog")
})
//---------
// Website
//---------
site := fiber.New()
site.Use(logger.New(logger.Config{
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
}))
hosts["localhost:3000"] = &Host{site}
site.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Website")
})
// Server
app := fiber.New()
app.Use(func(c *fiber.Ctx) error {
host := hosts[c.Hostname()]
if host == nil {
return c.SendStatus(fiber.StatusNotFound)
} else {
host.Fiber.Handler()(c.Context())
return nil
}
})
log.Fatal(app.Listen(":3000"))
}
如果需要更多信息,请参阅此问题 #750