mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-16 02:44:51 +00:00
43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { createError, showError } from '#app/composables/error'
|
|
import { useNuxtApp } from '#app/nuxt'
|
|
import { defineNuxtRouteMiddleware, useRouter } from '#app/composables/router'
|
|
|
|
export default defineNuxtRouteMiddleware(async (to) => {
|
|
if (!to.meta?.validate) { return }
|
|
|
|
const nuxtApp = useNuxtApp()
|
|
const router = useRouter()
|
|
|
|
const result = await Promise.resolve(to.meta.validate(to))
|
|
if (result === true) {
|
|
return
|
|
}
|
|
if (import.meta.server) {
|
|
return result
|
|
}
|
|
|
|
const error = createError({
|
|
statusCode: 404,
|
|
statusMessage: `Page Not Found: ${to.fullPath}`,
|
|
data: {
|
|
path: to.fullPath
|
|
}
|
|
})
|
|
const unsub = router.beforeResolve((final) => {
|
|
unsub()
|
|
if (final === to) {
|
|
const unsub = router.afterEach(async () => {
|
|
unsub()
|
|
await nuxtApp.runWithContext(() => showError(error))
|
|
// We pretend to have navigated to the invalid route so
|
|
// that the user can return to the previous page with
|
|
// the back button.
|
|
window.history.pushState({}, '', to.fullPath)
|
|
})
|
|
// We stop the navigation immediately before it resolves
|
|
// if there is no other route matching it.
|
|
return false
|
|
}
|
|
})
|
|
})
|