我正在尝试改进处理登录的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}
部分成为字符串变量,但我似乎无法使其正常工作。
答案 0 :(得分:2)
这样的东西?
field := "username"
if strings.Contains(login.Identifier, "@") {
field = "email"
}
err := collection("users").Find(bson.M{field: login}).One(&user)
if err != nil {
api.WriteError(w, 400, "USER_NOT_FOUND", "No user found with " + field + ": " + login)
}