使用mux Router – 如何将我的数据库传递给我的处理程序
|
目前,我尝试在服务器上使用Go进行数据处理来创建一个小型Web项目. 我尝试将我的数据库连接传递给我的HandlerFunc(tions)但它没有按预期工作.我对golang很新,所以也许我不明白这个lang的一些基本原理. 我的主要功能如下: func main() {
db,err := config.NewDB("username:password@/databasename?charset=utf8&parseTime=True")
if err != nil {
log.Panic(err)
}
env := &config.Env{DB: db}
router := NewRouter(env)
log.Fatal(http.ListenAndServe(":8080",router))
}
我的路由器: func NewRouter(env *config.Env) *mux.Router {
router := mux.NewRouter().StrictSlash(true)
for _,route := range routes {
var handler http.Handler
handler = route.HandlerFunc
handler = Logger(handler,route.Name)
router.
Methods(route.Method).
Path(route.Pattern).
Name(route.Name).
Handler(handler)
}
return router
}
和我的路线: type Route struct {
Name string
Method string
Pattern string
HandlerFunc http.HandlerFunc
}
type Routes []Route
var routes = Routes{
Route{
"Index","GET","/",controller.Index,},Route{
"Show","/todos/{todoId}",controller.TodoShow,Route{
"Create","POST","/todos",controller.TodoCreate,}
那么 – 如何将我的“env”(或env.DB)传递给我的FuncHandlers?我尝试了很多东西,但没有一个能奏效. 解决方法你有三个选择:>使您的数据库连接池成为全局数据库,这样您就不必传递它. sql.DB对于并发访问是安全的,这是最简单的方法.缺点是它会使测试变得更加困难,并且模糊了池的来源 – 例如 var db *sql.DB
func main() {
var err error
db,err = sql.Open(...)
// Now accessible globally,no need to pass it around
// ...
}
>将处理程序包裹在一个闭包中,使内部处理程序可以访问它.你需要根据你的路线范围进行调整 – 这是一个有点迟钝的IMO,并且更难以看到存在哪些路线,但我离题了 – 例如: func SomeHandler(db *sql.DB) http.HandlerFunc {
fn := func(w http.ResponseWriter,r *http.Request) {
res,err := db.GetThings()
// etc.
}
return http.HandlerFunc(fn)
}
func main() {
db,err := sql.Open(...)
http.HandleFunc("/some-route",SomeHandler(db))
// etc.
}
>创建一个接受处理程序的自定义处理程序类型 – 例如 type AppHandler struct {
Handler func(env *config.Env,w http.ResponseWriter,r *http.Request)
Env *config.Env
// ServeHTTP allows your type to satisfy the http.Handler interface.
func (ah *AppHandler) ServeHTTP(w http.ResponseWriter,r *http.Request) {
ah.Handler(ah.Env,w,r)
}
func SomeHandler(env *config.Env,r *http.Request) {
res,err := env.DB.GetThings()
// etc.
}
请注意(无耻的插件!)我已经written about the last approach in detail了,而且Alex Edwards在访问Go程序中的数据库池的方法上也有excellent blog post. 我可以给出的唯一严格的建议是,你应该回避在请求上下文中传递你的数据库池,这是低效的而不是良好的实践(请求上下文是针对临时的,每请求对象). (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – 谓词:在WHERE子句或JOIN子句中?
- sql – oracle提高了查询性能
- 如何查看哪些IP地址向SQL Server发出请求?
- sql – 如何获取一个WPF DataGrid保存更改回到数据库?
- SQL Server中Linked Server及Remote Server的使用示例
- sql-server – SQL Server中的时间格式
- 如何在SQL中使用NOT EXISTS和COMPOSITE KEYS从POJO插入数据
- 如何创建一个简单的本地SQL数据库并使用C#将值插入其中?
- sql-server – 从SQL Server 2008查询结果中选择第n行,其中
- 清除SQLServer日志的两种方法
- sql – 使用SELECT锁定Oracle … FOR UPDATE OF
- 我如何在SQL Server Express数据库中创建一个用户
- sql-server-2008 – 使用ISNULL和NULLIF时,sql s
- sql-server – INSERT权限被拒绝对象’employee_
- sql – 在Teradata中使用COLLECT STATISTICS
- 如何创建不映射到数据库表的Django模型
- SQL Server 必备DBCC的简单示例
- MYSQL ERROR 1045 (28000): Access denied for u
- sql – 在SELECT语句中提取分隔值右侧的字符
- 如何在SQL Server 2005中进行sql表的尴尬转移?
