Middleware runs before routing and has no knowledge of which handler will process the request. It cannot read @SetMetadata() values, know which controller or method will handle the request, make decisions based on route-level metadata, or access the response after the handler completes the way interceptors can.
Cannot read @SetMetadata() values — no handler reference means no Reflector access.
Cannot know which controller class or method will handle the request.
Cannot short-circuit based on route-level metadata like @Public() or @Roles().
Cannot access the response after the handler completes — interceptors can.
Cannot observe the final response body — only guards and interceptors have this ability.