golang appengine внутренняя ошибка сервера

Я пытаюсь разработать пользовательскую модель/код аутентификации пользователя в Go on GAE. Следующий код представляет собой простую модификацию некоторого кода в приложении demos/guestbook:

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. Такой небольшой мод:

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

создает ту же страницу «Внутренняя ошибка сервера», а не просто печатает «пользователь не найден».

Спасибо!


person cachu82    schedule 09.01.2013    source источник


Ответы (1)


Трудно сказать, не видя остальной части вашего кода, но главное в том, что когда вы говорите:

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")
     }

Вероятно, есть более идиоматический способ, но я считаю, что он сработает в вашей ситуации (он будет напечатан так, как вы там указали - вы можете захотеть обработать его по-другому).

person RocketDonkey    schedule 09.01.2013