middleware
Nuxt provides a customizable route middleware framework you can use throughout your application, ideal for extracting code that you want to run before navigating to a particular route.
There are three kinds of route middleware:
- Anonymous (or inline) route middleware, which are defined directly in the pages where they are used.
- Named route middleware, which are placed in the
middleware/
directory and will be automatically loaded via asynchronous import when used on a page. (Note: The route middleware name is normalized to kebab-case, sosomeMiddleware
becomessome-middleware
.) - Global route middleware, which are placed in the
middleware/
directory (with a.global
suffix) and will be automatically run on every route change.
The first two kinds of route middleware can be defined in definePageMeta
.
Format
Route middleware are navigation guards that receive the current route and the next route as arguments.
export default defineNuxtRouteMiddleware((to, from) => { if (to.params.id === '1') { return abortNavigation() } return navigateTo('/')})
Nuxt provides two globally available helpers that can be returned directly from the middleware:
navigateTo (route: string | Route, options: { redirectCode: number, replace: boolean )
- Redirects to the given route, within plugins or middleware. It can also be called directly to perform page navigation.abortNavigation (err?: string | Error)
- Aborts the navigation, with an optional error message.
Unlike navigation guards in the vue-router docs, a third next()
argument is not passed, and redirects or route cancellation is handled by returning a value from the middleware. Possible return values are:
- nothing - does not block navigation and will move to the next middleware function, if any, or complete the route navigation
return navigateTo('/')
orreturn navigateTo({ path: '/' })
- redirects to the given path and will set the redirect code to302
Found if the redirect happens on the server sidereturn navigateTo('/', { redirectCode: 301 })
- redirects to the given path and will set the redirect code to301
Moved Permanently if the redirect happens on the server side
return abortNavigation()
- stops the current navigationreturn abortNavigation(error)
- rejects the current navigation with an error
Adding middleware dynamically
It is possible to add global or named route middleware manually using the addRouteMiddleware()
helper function, such as from within a plugin.
export default defineNuxtPlugin(() => { addRouteMiddleware('global-test', () => { console.log('this global middleware was added in a plugin and will be run on every route change') }, { global: true }) addRouteMiddleware('named-test', () => { console.log('this named middleware was added in a plugin and would override any existing middleware of the same name') })})
Example: a named route middleware
-| middleware/---| auth.ts
In your page file, you can reference this route middleware
<script setup>definePageMeta({ middleware: ["auth"] // or middleware: 'auth'})</script>
Now, before navigation to that page can complete, the auth
route middleware will be run.