2013-01-09 34 views
1

我正在嘗試在GAE上開發自定義用戶模型/驗證代碼。下面的代碼是在演示/留言板應用程序代碼的一些簡單的修改:golang appengine內部服務器錯誤

q := datastore.NewQuery("User").Filter("Email =", email) 
users := make([]User, 0, 1) 
if _, err := q.GetAll(c, &users); err != nil { 
    http.Error(w, err.Error(), http.StatusInternalServerError) 
    return 
} 

如果電子郵件是從形式拉動。它只是用給定的電子郵件查詢用戶的數據存儲。如果帶有電子郵件的用戶存在,它會很好地工作,如果他們沒有,則會在「內部服務器錯誤」頁面中死掉。我不明白的(我猜想關於Go中的錯誤處理,或者數據存儲查詢),這就是爲什麼我不能在if error塊中做其他任何事情。像這樣的輕微MOD:

if _, err := q.GetAll(c, &users); err != nil { 
    fmt.Fprintf(w, "%s\n", "user not found") 
} 

產生的只是印刷「用戶未找到」相同的「內部服務器錯誤」頁面,而不是。

謝謝!

回答

2

這是艱難的,沒有看到你的代碼的其餘部分的說法,但主要的一點是,當你說:

if _, err := q.GetAll(c, &users); err != nil { 
    fmt.Fprintf(w, "%s\n", "user not found") 
} 

內聲明將僅在查詢過程中出現了錯誤觸發,如果查詢不返回任何內容則不行因此,你實際上並沒有進入該代碼塊 - 我最好的猜測(沒有看到代碼)是你的Internal Server Error正在其他地方被觸發,也許在某些地方你將users當作包含數據的變量。如果你想打印出消息,如果沒有用戶匹配,你可以做一些簡單的像檢查響應的長度 - 如果它是0,沒有返回任何結果,你可以打印你的留言:

 if len(users) == 0 { 
     fmt.Fprintf(w, "%s\n", "user not found") 
    } 

有可能是一種更習慣的方式,但我相信這會適合你的情況(它會像你在那裏陳述的那樣打印 - 你可能想要以不同的方式處理)。