I have this function that is returning an error sql: Rows are closed
. I can't figure out why...
Here is the function :
func GetUserFromToken(db *sql.DB, token string) User {
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token=$1
`
rows, err := db.Query(query, token)
if err != nil {
fmt.Println("query error : " + err.Error())
}
var user User
rows.Next()
err = rows.Scan(&user.ID, &user.Token, &user.Name, &user.Surname, &user.Phone, &user.Email)
if err != nil {
fmt.Println("scan error : " + err.Error())
}
return user
}
When I log the token it's the proper token. When I hard code the token in the query for testing purposes, it works fine. For instance :
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345'
`
Tried also to set the query such as :
query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"
row := db.QueryRow(query, "abcdefg12345")
It works fine. fmt.Println(token)
prints abcdefg12345
.
Would someone help me understand what I'm missing ?
UPDATE : found my fail.
So the token I had was the bearer token extracted from the header with the following function :
func GetBearerToken(r *http.Request) string {
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
reqToken = splitToken[1]
return reqToken
}
Had a leading whitespace that I did not notice in my fmt.Println. After a good night of sleep thinking about @RayfenWindspear's comment I had this urging to check string length then I saw the fail. Feeling a bit idiotic and amused at the same time that I didn't catch it.
So my simple fix :
from: reqToken = splitToken[1]
to : strings.TrimSpace(splitToken[1])