2015-07-21 163 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

相關問題