Gérer les erreurs comme un pro dans Nuxt 3 : Guide complet

Elvin KyunguElvin Kyungu
3 min read

Introduction

Dans toute application web, les erreurs sont inévitables :

  • un appel API qui échoue,

  • un utilisateur qui tape une URL inexistante,

  • un serveur qui retourne une erreur 500.

Avec Nuxt 3, la gestion des erreurs a été simplifiée grâce à des outils puissants comme :
1. showError()
2. useError()
3. createError()
4. et les pages d’erreurs personnalisées.

Dans cet article, on va voir comment les utiliser pour :
1. Créer une expérience utilisateur fluide même en cas d’erreur.
2. Éviter les crashs imprévus côté serveur et client.
3. Proposer des pages d’erreur élégantes et utiles.

1. Les outils de gestion d’erreurs dans Nuxt 3

Nuxt 3 fournit 3 fonctions principales pour gérer les erreurs :

FonctionUtilisation
showError()Déclenche une erreur côté client
useError()Récupère les infos de l’erreur active
createError()Génère une erreur côté serveur (API)

2. Déclencher une erreur avec showError()

Quand une action côté client échoue, utilise showError pour rediriger automatiquement vers la page d’erreur.

Exemple : appel API dans une page

<script setup>
const { data, error } = await useFetch('/api/posts')

if (error.value) {
  showError({
    statusCode: 404,
    statusMessage: 'Articles introuvables.'
  })
}
</script>

Ici, si l’API renvoie une erreur, l’utilisateur sera redirigé vers la page /error avec le code et le message fournis.

3. Récupérer les erreurs avec useError()

Sur la page d’erreur (error.vue), tu peux récupérer les détails avec useError() :

<template>
  <div class="error-page">
    <h1>Oups 😥 Erreur {{ error.statusCode }}</h1>
    <p>{{ error.statusMessage }}</p>
    <NuxtLink to="/" class="btn">Retour à l’accueil</NuxtLink>
  </div>
</template>

<script setup>
const error = useError()
</script>

4. Générer des erreurs personnalisées avec createError()

Pourquoi createError() ?

C’est la fonction à utiliser côté serveur (dans des API ou middlewares) pour envoyer une réponse d’erreur propre à Nuxt.

Exemple : dans une API

// server/api/posts.ts
export default defineEventHandler(async (event) => {
  const posts = await fetchPostsFromDB()

  if (!posts.length) {
    throw createError({
      statusCode: 404,
      statusMessage: 'Aucun article trouvé.'
    })
  }

  return posts
})

Ici, si la base de données ne retourne aucun article, l’API renverra une erreur HTTP 404 avec un message explicite.

Exemple : middleware de protection

// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  const isAuthenticated = false // Supposons l’utilisateur non connecté

  if (!isAuthenticated) {
    throw createError({
      statusCode: 401,
      statusMessage: 'Accès refusé : veuillez vous connecter.'
    })
  }
})

L’utilisateur non connecté sera redirigé vers la page d’erreur avec le code 401.

5. Créer une page d’erreurs personnalisée

Pour améliorer l’expérience utilisateur, crée un fichier error.vue dans /error :

<template>
  <div class="error-page">
    <h1>Erreur {{ error.statusCode }}</h1>
    <p>{{ error.statusMessage }}</p>
    <NuxtLink to="/" class="btn">Retour à l’accueil</NuxtLink>
  </div>
</template>

<script setup>
const error = useError()
</script>

<style scoped>
.error-page {
  text-align: center;
  margin-top: 50px;
}
h1 {
  font-size: 3rem;
  color: #42b883;
}
p {
  margin: 20px 0;
}
.btn {
  background: #42b883;
  color: white;
  padding: 10px 20px;
  border-radius: 8px;
  text-decoration: none;
}
</style>

Conclusion

Avec showError, useError, et createError, Nuxt 3 te donne toutes les clés pour :

  • Attraper les erreurs côté client et serveur,

  • Fournir des messages explicites,

  • Et créer des pages d’erreur élégantes.

Une bonne gestion des erreurs améliore la qualité et la confiance dans ton application.

1
Subscribe to my newsletter

Read articles from Elvin Kyungu directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Elvin Kyungu
Elvin Kyungu

I'm Elvin Kyungu, i am a front-end web developer | Google DSC Lead | Content creator | Lovers of tailwindcss, Vue js and Nuxt js