2015-07-21 209 views
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}零件成为一个字符串变量,但我似乎无法得到这个工作。

+0

'ERR:= ...'创建一个新的'err'可变局部范围,它从阴影更远的范围的任何'err'变量和新变量消失在当前的端'{}'块。你可以在'if'之前加'var err error'并在'if'体内使用'err = ...'。 –

回答

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) 
} 
+0

当然 - 我在那里的一半,但没有想到这一点。现在试试... – tommyd456

相关问题