我有這個返回錯誤的函數(shù)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}當(dāng)我記錄令牌時,它是正確的令牌。當(dāng)我出于測試目的在查詢中對令牌進(jìn)行硬編碼時,它工作正常。例如 :query := ` SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345' `還嘗試設(shè)置查詢,例如:query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"row := db.QueryRow(query, "abcdefg12345")它工作正常。fmt.Println(token)版畫abcdefg12345。有人會幫助我了解我所缺少的嗎?更新:發(fā)現(xiàn)我失敗了。所以我擁有的令牌是使用以下函數(shù)從標(biāo)頭中提取的不記名令牌:func GetBearerToken(r *http.Request) string { reqToken := r.Header.Get("Authorization") splitToken := strings.Split(reqToken, "Bearer") reqToken = splitToken[1] return reqToken}有一個我在 fmt.Println 中沒有注意到的前導(dǎo)空格。在考慮了@RayfenWindspear 的評論后,睡了一夜好覺,我敦促檢查字符串長度,然后我看到了失敗。感覺有點(diǎn)白癡,同時又覺得好笑,因為我沒聽懂。所以我的簡單修復(fù):從:reqToken = splitToken[1] 到: strings.TrimSpace(splitToken[1])
1 回答

繁星淼淼
TA貢獻(xiàn)1775條經(jīng)驗 獲得超11個贊
這是您編寫此代碼的方式。如果未返回任何內(nèi)容,則返回的錯誤將是 sql.ErrNoRows。讓我知道這是如何工作的,然后也許我可以提供其他調(diào)試步驟。
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
}
- 1 回答
- 0 關(guān)注
- 165 瀏覽
添加回答
舉報
0/150
提交
取消