GoogleCloudPlatform/microservices-demo · error
failed to empty cart
Error message
failed to empty cart
What it means
emptyCartHandler failed to empty the user's cart via fe.emptyCart (cartservice EmptyCart RPC). The error is wrapped as "failed to empty cart" and returned as HTTP 500 instead of redirecting to the home page.
Source
Thrown at src/frontend/handlers.go:244
if err != nil {
renderHTTPError(log, r, w, errors.Wrap(err, "could not retrieve product"), http.StatusInternalServerError)
return
}
if err := fe.insertCart(r.Context(), sessionID(r), p.GetId(), int32(payload.Quantity)); err != nil {
renderHTTPError(log, r, w, errors.Wrap(err, "failed to add to cart"), http.StatusInternalServerError)
return
}
w.Header().Set("location", baseUrl + "/cart")
w.WriteHeader(http.StatusFound)
}
func (fe *frontendServer) emptyCartHandler(w http.ResponseWriter, r *http.Request) {
log := r.Context().Value(ctxKeyLog{}).(logrus.FieldLogger)
log.Debug("emptying cart")
if err := fe.emptyCart(r.Context(), sessionID(r)); err != nil {
renderHTTPError(log, r, w, errors.Wrap(err, "failed to empty cart"), http.StatusInternalServerError)
return
}
w.Header().Set("location", baseUrl + "/")
w.WriteHeader(http.StatusFound)
}
func (fe *frontendServer) viewCartHandler(w http.ResponseWriter, r *http.Request) {
log := r.Context().Value(ctxKeyLog{}).(logrus.FieldLogger)
log.Debug("view user cart")
currencies, err := fe.getCurrencies(r.Context())
if err != nil {
renderHTTPError(log, r, w, errors.Wrap(err, "could not retrieve currencies"), http.StatusInternalServerError)
return
}
cart, err := fe.getCart(r.Context(), sessionID(r))
if err != nil {
renderHTTPError(log, r, w, errors.Wrap(err, "could not retrieve cart"), http.StatusInternalServerError)
returnView on GitHub (pinned to 72ba613a05)
Solutions
- Check cartservice health and logs.
- Verify CART_SERVICE_ADDR env configuration in frontend.
- Check the redis backend used by cartservice.
- Ensure sessionID(r) produces a valid non-empty user id; otherwise fix session cookie handling.
Example fix
// before
if err := fe.emptyCart(r.Context(), sessionID(r)); err != nil {
// after
if sessionID(r) == "" {
http.Redirect(w, r, baseUrl+"/", http.StatusFound)
return
}
if err := fe.emptyCart(r.Context(), sessionID(r)); err != nil { Defensive patterns
Strategy: validation
Validate before calling
uid := sessionID(r)
if uid == "" {
http.Redirect(w, r, baseUrl+"/", http.StatusFound)
return
} Type guard
func hasSession(r *http.Request) bool { return sessionID(r) != "" } Try / catch
if err := fe.emptyCart(r.Context(), sessionID(r)); err != nil {
log.WithField("error", err).Warn("failed to empty cart")
renderHTTPError(log, r, w, errors.Wrap(err, "failed to empty cart"), http.StatusInternalServerError)
return
} Prevention
- Ensure session cookie middleware runs before handlers.
- Verify CART_SERVICE_ADDR at frontend startup.
- Watch cartservice/redis health; emptying depends on both.
- Treat empty-session requests as no-ops, not RPC failures.
When it happens
Trigger: POST /cart/empty when cartservice EmptyCart returns an error: service unavailable, timeout, or an invalid/empty session user id rejected by the cart service.
Common situations: cartservice down or restarting, redis backend unreachable, session/user id missing or malformed (empty session cookie leading to an invalid empty-cart request).
Related errors
- failed to add to cart
- failed to get user cart during checkout: %+v
- failed to empty user cart during checkout: %+v
- could not retrieve cart
- failed to convert currency
AI-assisted analysis of GoogleCloudPlatform/microservices-demo@72ba613a05 (2026-09-02).
Data as JSON: /api/errors/cbfb15a0c0c79e74.
Report an issue: GitHub.