Skip to content

Middleware

Resux has two middleware layers:

  1. Route middleware from middleware/, used for page navigation.
  2. Request middleware from server/middleware/, used for every HTTP request before handlers, public files, and pages.

Route middleware

Create a route middleware file:

ts
// middleware/auth.ts
export default defineResuxRouteMiddleware((to, from) => {
  if (to.path.startsWith('/admin')) {
    return navigateTo('/login', { statusCode: 302 })
  }
})

Attach it to a page:

vue
<script setup lang="ts">
definePageMeta({ middleware: 'auth' })
</script>

Use more than one:

ts
definePageMeta({ middleware: ['auth', 'analytics'] })

Global route middleware

Files ending in .global.ts run globally.

ts
// middleware/analytics.global.ts
export default defineResuxRouteMiddleware((to) => {
  console.log('visiting', to.path)
})

Route middleware results

A route middleware can:

ReturnMeaning
nothingContinue navigation.
stringRedirect to that path.
falseAbort with forbidden behavior.
navigateTo('/path')Redirect.
abortNavigation('message')Abort navigation.

Request middleware

Request middleware runs before server handlers, static files, and pages.

ts
// server/middleware/security.ts
export default defineServerMiddleware((event) => {
  setHeader(event, 'x-app', 'resux')

  if (event.path.startsWith('/private')) {
    return { type: 'redirect', to: '/login', statusCode: 302 }
  }
})

Request middleware can:

  • Continue by returning nothing.
  • Use helpers such as setHeader(event, name, value).
  • End the Node response directly when necessary.
  • Return a Response.
  • Return a JSON-serializable value.
  • Return false for 403.
  • Return redirect or abort objects.

When to use which

NeedMiddleware type
Protect a page routeRoute middleware
Redirect before rendering pageRoute middleware
Add headers to all responsesRequest middleware
Short-circuit API/page/public requestsRequest middleware
Inspect raw request/responseRequest middleware

Stable v1 core docs for Resux, with experimental areas clearly marked.