fix(nuxt3): return error page on blocked initial navigation (#3201)

This commit is contained in:
Daniel Roe 2022-02-14 14:18:07 +00:00 committed by GitHub
parent 9734856fb0
commit 3589a2d55f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,6 +6,7 @@ import {
RouterLink, RouterLink,
NavigationGuard NavigationGuard
} from 'vue-router' } from 'vue-router'
import { createError } from 'h3'
import NuxtPage from './page' import NuxtPage from './page'
import NuxtLayout from './layout' import NuxtLayout from './layout'
import { callWithNuxt, defineNuxtPlugin, useRuntimeConfig } from '#app' import { callWithNuxt, defineNuxtPlugin, useRuntimeConfig } from '#app'
@ -93,6 +94,15 @@ export default defineNuxtPlugin((nuxtApp) => {
} }
const result = await callWithNuxt(nuxtApp, middleware, [to, from]) const result = await callWithNuxt(nuxtApp, middleware, [to, from])
if (process.server) {
if (result === false || result instanceof Error) {
const error = result || createError({
statusMessage: `Route navigation aborted: ${nuxtApp.ssrContext.url}`
})
nuxtApp.ssrContext.error = error
throw error
}
}
if (result || result === false) { return result } if (result || result === false) { return result }
} }
}) })
@ -112,13 +122,17 @@ export default defineNuxtPlugin((nuxtApp) => {
}) })
} }
try {
await router.isReady() await router.isReady()
const is404 = router.currentRoute.value.matched.length === 0 const is404 = router.currentRoute.value.matched.length === 0
if (process.server && is404) { if (process.server && is404) {
const error = new Error(`Page not found: ${nuxtApp.ssrContext.url}`) throw createError({
// @ts-ignore statusCode: 404,
error.statusCode = 404 statusMessage: `Page not found: ${nuxtApp.ssrContext.url}`
})
}
} catch (error) {
nuxtApp.ssrContext.error = error nuxtApp.ssrContext.error = error
} }
}) })