我在Golang上编写了API,遇到了一个错误.在一次请求服务器返回错误后,SQL数据库被关闭.我想通过上下文传输数据库连接.
玩.
func main() {
app := fiber.New()
db, err := sqlx.Connect("pgx", os.Getenv("POSTGRESQL_URL"))
if err != nil {
panic(err)
}
if err = db.Ping(); err != nil {
panic(err)
}
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)
db.SetConnMaxIdleTime(5 * time.Minute)
defer db.Close()
configure_router.ConfigureRouter(app, db)
if err = app.Listen(os.Getenv("PORT")); err != nil {
log.Fatalln(err)
}
}
CONFigure_router.go
func ConfigureRouter(app *fiber.App, db *sqlx.DB) {
//Middlewares
app.Use(logger.New(logger.Config{
Format: "[${ip}]:${port} ${time} ${status} - ${method} ${path}\n",
}))
app.Use(cors.New(cors.Config{
//AllowOrigins: "http://localhost:3000",
AllowHeaders: "Origin, Content-Type, Accept",
}))
app.Use("/api", func(ctx *fiber.Ctx) error {
ctx.Context().SetUserValue("dbConn", db)
return ctx.Next()
})
//Authentication endpoints
app.Post("api/register", register.Register)
app.Post("api/auth/login", login.Login)
}
Register.go
func Register(ctx *fiber.Ctx) error {
conn := ctx.Context().UserValue("dbConn").(*sqlx.DB)
var in In
if err := ctx.BodyParser(&in); err != nil {
return make_response.MakeInfoResponse(ctx, fiber.StatusUnprocessableEntity, 1, err.Error())
}
if in.Email == "" || in.Password == "" {
return make_response.MakeInfoResponse(ctx, fiber.StatusBadRequest, 1, "Incorrect data input")
}
elementExist := false
err := conn.Get(&elementExist, "select exists(select email from users where email = $1)", in.Email)
// Here programm fall in second request
if err != nil {
return make_response.MakeInfoResponse(ctx,fiber.StatusInternalServerError, 1, err.Error())
}
if elementExist {
return make_response.MakeInfoResponse(ctx, fiber.StatusBadRequest, 1, "User already registered!")
}
passwordHash, err := hash_passwords.HashPassword(in.Password)
if err != nil {
return err
}
_, err = conn.Exec("insert into users (email, password_hash) values ($1, $2)", in.Email, passwordHash)
if err != nil {
return make_response.MakeInfoResponse(ctx, fiber.StatusInternalServerError, 1, err.Error())
}
return make_response.MakeInfoResponse(ctx, fiber.StatusOK, 0, "Registration was successful!")
}
如果我在/API/REGISTER中发送请求,并且用户已经在第一个请求中注册,我会收到
要求:
{
"email": "test@gmail.com",
"password": "123123123"
}
第一个回应:
{
"error_code": 0,
"message": "User already registered!"
}
但如果我想发送另一个请求,我会收到:
{
"error_code": 1,
"message": "sql: database is closed",
}