我正在使用Go进行项目。
我正在尝试通过查询Postgres数据库来验证用户的会话。当我找到一个匹配项时,我想返回true,否则,我想返回false。
问题是,当我没有比赛时,我的程序反而抛出错误。我不确定如何在Go中捕获这些错误,或者我不确定如何运行查询。
func confirmUser(userID string, session string) bool {
sqlStatement := `SELECT u.id FROM users u INNER JOIN user_sessions s ON u.id = s.userid WHERE u.id = $1 AND s.session = $2`
id := 0
err := db.QueryRow(sqlStatement, userID, session).Scan(&id)
if err != nil {
panic(err)
return false
}
fmt.Println("Found:", id)
return true
}
我的db变量是全局变量,因为我在很多地方都在使用它。我认为问题出在.Scan()
调用中,但是我不确定解决此问题的更好方法。在PHP中,我将检查请求是否已成功发送,然后检查返回的行数。我不确定如何在Go中执行等效操作。
答案 0 :(得分:1)
panic()
退出程序。在您的示例中,return false
从未达到。在这种情况下,您可以先log.Println(err)
,然后再return false
。但老实说,在这样的go函数中,返回布尔和错误是一个好习惯。可以从数据库中返回错误,例如连接失败,sql错误,est等错误。
func confirmUser(userID string, session string) (error, bool) {
sqlStatement := `SELECT u.id FROM users u INNER JOIN user_sessions s ON u.id = s.userid WHERE u.id = $1 AND s.session = $2`
id := 0
err := db.QueryRow(sqlStatement, userID, session).Scan(&id)
if err != nil {
// if no rows there is no session
if err == sql.ErrNoRows {
return nil, false
}
// an error other than no rows was returned, return with error
return err, false
}
fmt.Println("Found:", id)
return nil, true
}
在调用confirmUser
的函数上,这样调用函数
err, valid := confirmUser("myuserid", "sessionstring")
if err != nil {
return err.Error()
}
if !valid (
return "user not valid"
}
// user is valid go on
答案 1 :(得分:0)
您针对sql.ErrNoRows
https://golang.org/pkg/database/sql/#pkg-variables
我还建议评估客户端会话存储https://github.com/gorilla/sessions#sessions