#go
#Вперед
Вопрос:
У меня есть служба, написанная на Go с использованием net/http
пакета.
http.HandleFunc("/hello", Hello)
log.Fatal(http.ListenAndServe(":8080", nil))
пока все хорошо.
Внутри func Hello
заглушка кода выглядит следующим образом:
func Hello(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("token")
if err != nil {
if err == http.ErrNoCookie {
// If the cookie is not set, return an unauthorized status
w.WriteHeader(http.StatusUnauthorized)
log.WithFields(log.Fields{
"fnc": "Hello",
}).Fatal(err)
return
//exit status 1 < Server stops here.
}
w.WriteHeader(http.StatusBadRequest)
log.WithFields(log.Fields{
"fnc": "Hello",
}).Fatal(err)
return
}
Проблемы возникают, когда поток кода достигает того места, где в запросе не найден файл cookie ErrNoCookie
, программа / сервер существует после инструкции return с отображением консоли exit status 1
, а на стороне клиента ошибка принимается как Error: read ECONNRESET
Однако, как служба, я ожидаю, что она продолжит работать и отвечать на последующие запросы.
Что я делаю не так?
Ответ №1:
Вы вызываете это:
log.WithFields(log.Fields{
"fnc": "Hello",
}).Fatal(err)
прямо перед возвратом. И Fatal
фактически завершается с кодом 1.
https://godoc.org/github.com/sirupsen/logrus#Fatal
Попробуйте удалить все вызовы Fatal
.