labstack/echo · warning

router has no routes to remove

Error message

router has no routes to remove

What it means

Returned by DefaultRouter.Remove (router.go:386-388) when the router tree is nil or the root is a leaf with no handler — i.e. nothing has been registered, so there is nothing to remove.

Source

Thrown at router.go:387

		m.propfind != nil ||
		m.trace != nil ||
		m.report != nil ||
		m.query != nil ||
		m.any != nil ||
		len(m.anyOther) != 0
	// RouteNotFound/404 is not considered as a handler
}

// Routes returns all registered routes
func (r *DefaultRouter) Routes() Routes {
	return r.routes
}

// Remove unregisters registered route
func (r *DefaultRouter) Remove(method string, path string) error {
	currentNode := r.tree
	if currentNode == nil || (currentNode.isLeaf && !currentNode.isHandler) {
		return errors.New("router has no routes to remove")
	}

	if path == "" {
		path = "/"
	}
	if path[0] != '/' {
		path = "/" + path
	}

	var nodeToRemove *node
	prefixLen := 0
	for {
		if currentNode.originalPath == path && currentNode.isHandler {
			nodeToRemove = currentNode
			break
		}
		if currentNode.kind == staticKind {
			prefixLen = prefixLen + len(currentNode.prefix)

View on GitHub (pinned to 05489dc173)

Solutions

  1. Register routes before calling Remove
  2. Guard with len(e.Routes()) > 0 before removing
  3. Treat the error as benign during teardown and log/ignore it

Example fix

// before
_ = e.Router().Remove("GET", "/users")
// after
if len(e.Routes()) > 0 {
    _ = e.Router().Remove("GET", "/users")
}
Defensive patterns

Strategy: validation

Validate before calling

if len(e.Routes()) == 0 {
    return nil // nothing to remove
}
return e.Router().Remove(method, path)

Try / catch

if err := e.Router().Remove(method, path); err != nil {
    if err.Error() == "router has no routes to remove" {
        return // benign during teardown
    }
    return err
}

Prevention

When it happens

Trigger: Calling e.Router().Remove("GET", "/users") on a fresh Echo instance before any e.GET(...) registered a route.

Common situations: Calling Remove during teardown of an app that failed to register routes, or in unit tests that exercise Remove on an empty router.

Related errors


AI-assisted analysis of labstack/echo@05489dc173 (2026-08-04). Data as JSON: /data/errors/fd3c04ffd552b03b.json. Report an issue: GitHub.