У меня есть эта функция, которая возвращает ошибку sql: Rows are closed
. Я не могу понять, почему ...
Вот функция:
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
}
Когда я регистрирую токен, это правильный токен. Когда я жестко кодирую токен в запросе для целей тестирования, он работает нормально. Например:
query := `
SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345'
`
Попытался также задать запрос, например:
query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"
row := db.QueryRow(query, "abcdefg12345")
Работает нормально. fmt.Println(token)
отпечатки abcdefg12345
.
Кто-нибудь поможет мне понять, чего мне не хватает?
ОБНОВЛЕНИЕ: обнаружен мой сбой.
Таким образом, у меня был токен, который был извлечен из заголовка со следующей функцией:
func GetBearerToken(r *http.Request) string {
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
reqToken = splitToken[1]
return reqToken
}
Имел лидирующие пробелы, которые я не заметил в моем fmt.Println После хорошей ночи сна, размышляя над комментарием @ RayfenWindspear, у меня возникло такое желание проверить длину строки, а затем я увидел ошибку. Чувствую себя немного идиотом и в то же время удивленным, что я его не уловил.
Итак, мое простое исправление:
от: reqToken = splitToken[1]
до: strings.TrimSpace(splitToken[1])