What Causes This Error?
This error occurs when you reference a middleware in your page or route that doesn’t exist or isn’t properly registered.
Common Causes and Fixes
Cause 1: Typo in Middleware Name
// ❌ Wrong - typo in middleware name
definePageMeta({
middleware: 'authentcation' // Typo!
})
// ✅ Correct
definePageMeta({
middleware: 'authentication'
})
Cause 2: Missing Middleware File
Ensure the middleware file exists in the middleware/ directory:
middleware/
auth.ts ← Creates 'auth' middleware
authentication.ts ← Creates 'authentication' middleware
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
// Your auth logic
})
Cause 3: Wrong File Extension
Nuxt looks for .ts, .js, or .mjs files:
// ❌ Wrong extensions
middleware/auth.vue
middleware/auth.json
// ✅ Correct extensions
middleware/auth.ts
middleware/auth.js
Cause 4: Nested Directory Not Supported
Middleware must be in the root of the middleware/ folder:
// ❌ Wrong - nested directories don't auto-register
middleware/
admin/
auth.ts ← Won't be registered as 'auth' or 'admin/auth'
// ✅ Correct - flat structure
middleware/
admin-auth.ts ← Registered as 'admin-auth'
Cause 5: Case Sensitivity
Middleware names are case-sensitive:
// If your file is: middleware/AuthGuard.ts
// ❌ Wrong
definePageMeta({
middleware: 'authguard' // Wrong case!
})
// ✅ Correct
definePageMeta({
middleware: 'AuthGuard'
})
Cause 6: Using Array Syntax Incorrectly
// ❌ Wrong - 'auth' is a string, not the middleware function
definePageMeta({
middleware: [auth] // ReferenceError or wrong middleware
})
// ✅ Correct - use string names in array
definePageMeta({
middleware: ['auth', 'logger']
})
Creating Middleware
Named Middleware (File-based)
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
const user = useUser()
if (!user.value) {
return navigateTo('/login')
}
})
Use it:
definePageMeta({
middleware: 'auth'
})
Inline Middleware (Route-level)
definePageMeta({
middleware: [
function (to, from) {
// Inline middleware logic
}
]
})
Global Middleware
Add .global suffix to run on every route:
// middleware/logger.global.ts
export default defineNuxtRouteMiddleware((to, from) => {
console.log('Navigating to:', to.path)
})
Adding Middleware Programmatically
// plugins/middleware.ts
export default defineNuxtPlugin(() => {
addRouteMiddleware('custom', (to, from) => {
console.log('Custom middleware')
})
})
Debugging
Check which middleware are registered:
// In a component or page
const router = useRouter()
console.log('Available middleware:', router.options.routes)
Middleware Naming Convention
| File Name | Middleware Name |
|---|---|
auth.ts | auth |
auth-guard.ts | auth-guard |
AuthGuard.ts | AuthGuard |
01.setup.global.ts | 01.setup (global) |
Quick Checklist
- File exists in
middleware/directory - File has
.ts,.js, or.mjsextension - File exports default with
defineNuxtRouteMiddleware - Middleware name matches filename (case-sensitive)
- Using string name in
definePageMeta, not variable reference - No typos in middleware name