What Causes This Error?
This error appears when Nuxt catches an unhandled exception during the client-side app initialization phase. It’s a catch-all error that wraps the actual underlying issue.
Finding the Real Error
The actual error is logged separately in the console. Look for additional error messages:
// You'll see something like:
[nuxt] error caught during app initialization
TypeError: Cannot read properties of undefined (reading 'someProperty')
at setup (MyComponent.vue:15)
Common Causes
1. Accessing Undefined Variables
// ❌ Wrong - user might be undefined
const userName = user.name
// ✅ Correct - use optional chaining
const userName = user?.name
2. Browser API on Server
// ❌ Wrong - window doesn't exist on server
const width = window.innerWidth
// ✅ Correct - check for client
if (process.client) {
const width = window.innerWidth
}
// ✅ Or use onMounted
onMounted(() => {
const width = window.innerWidth
})
3. Plugin Errors
// plugins/broken.ts
export default defineNuxtPlugin(() => {
// ❌ This error will cause app initialization to fail
throw new Error('Plugin failed')
})
Fix by adding error handling:
export default defineNuxtPlugin(() => {
try {
// Plugin logic
} catch (error) {
console.error('Plugin error:', error)
}
})
4. Invalid Composable Usage
// ❌ Wrong - composable outside setup
setTimeout(() => {
const route = useRoute() // Fails!
}, 0)
Debugging Steps
Step 1: Check Browser Console
Open DevTools (F12) → Console tab. Look for the actual error after the initialization message.
Step 2: Enable Source Maps
// nuxt.config.ts
export default defineNuxtConfig({
sourcemap: {
client: true
}
})
Step 3: Use Vue DevTools
Install Vue DevTools browser extension to inspect component state.
Step 4: Add Error Boundary
<!-- app.vue -->
<template>
<NuxtErrorBoundary @error="handleError">
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</NuxtErrorBoundary>
</template>
<script setup>
const handleError = (error) => {
console.error('Caught error:', error)
}
</script>
Common Fixes
Fix Hydration Mismatches
<script setup>
// Use ClientOnly for browser-specific content
</script>
<template>
<ClientOnly>
<BrowserOnlyComponent />
</ClientOnly>
</template>
Handle Async Data
// ✅ Always handle potential null/undefined
const { data } = await useFetch('/api/user')
// Check before using
if (data.value) {
console.log(data.value.name)
}
Validate Props
<script setup>
const props = defineProps({
user: {
type: Object,
required: true,
validator: (v) => v && v.id
}
})
</script>
Prevention
- Use TypeScript - Catches many errors at compile time
- Enable strict mode -
strict: truein tsconfig - Test SSR - Run
nuxt build && nuxt preview - Add error boundaries - Catch errors gracefully
- Use optional chaining -
?.for potentially undefined values
Quick Checklist
- Check browser console for the actual error
- Verify no browser APIs used during SSR
- Check all plugins for errors
- Ensure composables are called in setup
- Validate all data before accessing properties