我有这个返回错误的函数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])
繁星淼淼
相关分类