Как правильно связать переменную postgresql в Go? - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть эта функция, которая возвращает ошибку 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])

1 Ответ

0 голосов
/ 09 ноября 2018

Вот как бы вы написали этот код. Возвращенная ошибка будет sql.ErrNoRows, если ничего не было возвращено. Дайте мне знать, как это работает, и тогда, возможно, я смогу дать другие шаги по отладке.

func GetUserFromToken(db *sql.DB, token string) (u User, err error) {
  err = db.QueryRow(
    "SELECT id, token, name, surname, phone, email FROM users WHERE token=$1",
    token,
  ).Scan(
    &u.ID,
    &u.Token,
    &u.Name,
    &u.Surname,
    &u.Phone,
    &u.Email)
  return
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...