我有此函数返回错误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])
答案 0 :(得分:2)
这是您编写此代码的方式。如果未返回任何内容,则返回的err将为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
}