使用用户名或电子邮件地址登录

时间:2015-07-21 13:16:10

标签: go mgo

我正在尝试改进处理登录的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}部分成为字符串变量,但我似乎无法使其正常工作。

1 个答案:

答案 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)
}
相关问题