Способы вызова 404 ошибки в Nuxt.js

от автора

в
Время чтения: 2 мин.

В Nuxt.js есть несколько способов выкинуть 404 ошибку, чтобы фреймворк корректно её обработал и отобразил соответствующую страницу ошибки.

Основные методы:

1. Использование throw createError()

// В любом компоненте или странице
throw createError({
  statusCode: 404,
  statusMessage: 'Страница не найдена',
  fatal: true
})

2. В асинхронных данных (asyncData или fetch)

export default {
  async asyncData({ $axios, error }) {
    try {
      const post = await $axios.$get('/api/post/123')
      if (!post) {
        throw createError({ statusCode: 404, message: 'Пост не найден' })
      }
      return { post }
    } catch (err) {
      if (err.response && err.response.status === 404) {
        throw createError({ statusCode: 404, message: 'Пост не найден' })
      }
      // Обработка других ошибок
    }
  }
}

3. В middleware

export default function ({ route, redirect, error }) {
  if (!route.params.id) {
    // Старый способ (для Nuxt 2)
    // error({ statusCode: 404, message: 'Не найдено' })

    // Новый способ (Nuxt 3)
    throw createError({ statusCode: 404, message: 'Не найдено' })
  }
}

4. В обработчиках API маршрутов (server/api)

// server/api/test.get.ts
export default defineEventHandler((event) => {
  throw createError({
    statusCode: 404,
    statusMessage: 'Not Found'
  })
})

Настройка кастомной страницы 404

Nuxt автоматически использует файл ~/error.vue для отображения ошибок. Вы можете создать или изменить этот файл для кастомного отображения:

<!-- ~/error.vue -->
<template>
  <div>
    <h1 v-if="error.statusCode === 404">Страница не найдена</h1>
    <h1 v-else>Произошла ошибка</h1>
    <p>{{ error.message }}</p>
    <button @click="handleError">Вернуться на главную</button>
  </div>
</template>

<script setup>
const props = defineProps({
  error: Object
})

const handleError = () => clearError({ redirect: '/' })
</script>

Для Nuxt 3 также можно создать отдельную страницу ~/pages/[...slug].vue для обработки 404 ошибок маршрутизации.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 3 + 4?