Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mengakses pangkalan data jika fungsi berada dalam modul yang berbeza?
Editor PHP Zimo berada di sini untuk menjawab soalan biasa: Bagaimanakah anda harus beroperasi jika anda mengakses pangkalan data dalam modul yang berbeza? Semasa proses pembangunan, kita sering perlu mengakses pangkalan data dalam modul berfungsi yang berbeza, yang melibatkan cara mengurus sambungan pangkalan data dan melaksanakan operasi pangkalan data. Untuk menyelesaikan masalah ini, kita boleh menggunakan pelbagai kaedah, seperti menggunakan pembolehubah global, mod tunggal, suntikan kebergantungan, dll. Kaedah yang manakah untuk dipilih bergantung pada keperluan projek dan tabiat pasukan pembangunan. Seterusnya, saya akan memperkenalkan kaedah ini secara terperinci, dengan harapan dapat membantu semua orang.
Saya cuba atuhorize menggunakan jwt tetapi saya menghadapi masalah, apabila saya menyemak e-mel dari e-mel nilai yang dituntut saya mendapat ralat 500. Masalahnya adalah kerana pangkalan data belum siap lagi.
Ini kodnya
Laluan Pakej
package route import ( "go_fiber/controller" "go_fiber/middleware" "github.com/gofiber/fiber/v2" ) func routeinit(app *fiber.app, usercontroller controller.usercontroller) { app.get("/users", middleware.authmiddleware, usercontroller.findall) app.post("/login", usercontroller.login) }
Aplikasi pembungkusan
package app import ( "database/sql" "fmt" "go_fiber/helper" "os" "time" _ "github.com/go-sql-driver/mysql" "github.com/joho/godotenv" ) func newdb() *sql.db { var ( username = envvariable("db_username") password = envvariable("db_password") host = envvariable("db_host") port = envvariable("db_port") db_name = envvariable("db_name") ) dns := fmt.sprintf("%s:%s@tcp(%s:%s)/%s?parsetime=true", username, password, host, port, db_name) db, err := sql.open("mysql", dns) if err != nil { panic(err) } db.setmaxidleconns(10) db.setmaxopenconns(100) db.setconnmaxidletime(5 * time.minute) db.setconnmaxlifetime(60 * time.minute) return db }
Packmaster
package main import ( "go_fiber/app" "go_fiber/controller" "go_fiber/exception" "go_fiber/repository" "go_fiber/route" "go_fiber/service" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" ) func main(){ var db = app.newdb() app := fiber.new() app.use(func(c *fiber.ctx) error { defer func() { if err := recover(); err != nil { exception.errorhandler(c, err) } }() return c.next() }) validator := validator.new() userrepository := repository.newuserrepository() userservice := service.newuserservice(userrepository, db, validator) usercontroller := controller.newusercontroller(userservice) route.routeinit(app, usercontroller) app.listen(":3000") }
Perisian tengah pembungkusan
package middleware import ( "database/sql" "errors" "fmt" "go_fiber/exception" "log" "os" "time" "github.com/gofiber/fiber/v2" "github.com/golang-jwt/jwt/v4" ) func authmiddleware(c *fiber.ctx) error{ tokenstring := c.cookies("authorization") log.printf("(middleware) token : %v", tokenstring) if tokenstring == "" { panic(exception.newuserunauthorized(errors.new("user unauthorized").error())) } token, err := jwt.parse(tokenstring, func(token *jwt.token) (interface{}, error) { if _, ok := token.method.(*jwt.signingmethodhmac); !ok { return nil, fmt.errorf("unexpected signing method :%v", token.header["sub"]) } return []byte(os.getenv("secret")), nil }) log.printf("(middleware) token : %v", token) log.printf("(middleware) error : %v", err) if claims, ok := token.claims.(jwt.mapclaims); ok && token.valid { if float64(time.now().unix()) > claims["exp"].(float64) { panic(exception.newuserunauthorized(errors.new("user unauthorized").error())) } log.printf("(middleware) claims : %v", claims) log.printf("(middleware) ok : %v", ok) var db *sql.db tx, err := db.begin() log.printf("(middleware) tx : %v", tx) log.printf("(middleware) error : %v", err) query :=` select email from users where email = ? limit 1 ` log.printf("(middleware) query : %v", query) user, err := tx.querycontext(c.context(), query, claims["sub"]) log.printf("(middleware) user : %v", user) log.printf("(middleware) error : %v", err) if err != nil { panic(exception.newuserunauthorized(errors.new("user unauthorized").error())) } c.locals("user", user) c.next() }else { panic(exception.newuserunauthorized(errors.new("user unauthorized").error())) } return nil }
Bahagian ini adalah kod masalah
var db *sql.db tx, err := db.begin() log.printf("(middleware) tx : %v", tx) // no detect in terminal
Ini adalah output log
2023/02/12 10:00:04 (middleware) token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzYxNzEzOTIsInN1YiI6IkphZmFyQGdtYWlsLmNvbSJ9.6nn_IaNACHfe7flFMOXfj1ygZS-U_yrnU_Gvjn8xCp8 2023/02/12 10:00:04 (middleware) token : &{eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzYxNzEzOTIsInN1YiI6IkphZmFyQGdtYWlsLmNvbSJ9.6nn_IaNACHfe7flFMOXfj1ygZS-U_yrnU_Gvjn8xCp8 0xc0000a6780 map[alg:HS256 typ:JWT] map[exp:1.676171392e+09 sub:[email protected]] 6nn_IaNACHfe7flFMOXfj1ygZS-U_yrnU_Gvjn8xCp8 true} 2023/02/12 10:00:04 (middleware) error : <nil> 2023/02/12 10:00:04 (middleware) claims : map[exp:1.676171392e+09 sub:[email protected]] 2023/02/12 10:00:04 (middleware) ok : true
Jadi, bagaimana untuk menyelesaikan masalah mengakses pangkalan data jika pakej berbeza?
Anda harus menyerahkan pengendali pangkalan data ke perisian tengah melalui pendaftaran laluan.
Tukar perisian authmiddle anda supaya ia dikembalikan oleh fungsi yang mengambil db *sql.db sebagai hujah:
func newauthmiddleware(db *sql.db) fiber.handler { return func(c *fiber.ctx) error { // the rest of your function is here and has access to db } }
Maka anda perlu memanggil newauthmiddleware dalam fungsi routeinit
func routeinit(app *fiber.app, usercontroller controller.usercontroller, db *sql.db) { app.get("/users", middleware.newauthmiddleware(db), usercontroller.findall) app.post("/login", usercontroller.login) }
Kemudian hantar pangkalan data ke routeinit() dalam fungsi utama
func main() { // ... as before route.RouteInit(app, userController, db) }
Atas ialah kandungan terperinci Bagaimana untuk mengakses pangkalan data jika fungsi berada dalam modul yang berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!