0
我正在尝试改进处理登录的Go应用程序中的一段代码。它会收到一个login
值和password
值,然后检查数据库中的username
字段或email
字段以查看是否可以找到用户。如果login
包含@
符号,则将使用电子邮件。用用户名或电子邮件地址登录
所以我目前有:
if strings.Contains(login, "@") {
err := collection("users").Find(bson.M{"email" : login}).One(&user)
if err != nil { //no user found
api.WriteError(w, 400, "USER_NOT_FOUND", "No user found with email address: " + login)
return
}
} else {
err := collection("users").Find(bson.M{"username" : login}).One(&user)
if err != nil { //no user found
api.WriteError(w, 400, "USER_NOT_FOUND", "No user found with username: " + login)
return
}
}
//go on and check password
但你可以看到,因为我必须处理同样的错误两次,这不是很有效。我也试过:
if strings.Contains(login.Identifier, "@") {
err := collection("users").Find(bson.M{}).One(&user)
} else {
err := collection("users").Find(bson.M{"username" : login}).One(&user)
}
if err != nil { //no user found
api.WriteError(w, 400, "USER_NOT_FOUND", "No user found with email address: " + login)
return
}
//go on and check password
但是err
并不总是存在。
我想过让{"username" : login}
零件成为一个字符串变量,但我似乎无法得到这个工作。
'ERR:= ...'创建一个新的'err'可变局部范围,它从阴影更远的范围的任何'err'变量和新变量消失在当前的端'{}'块。你可以在'if'之前加'var err error'并在'if'体内使用'err = ...'。 –