我一直在开发一个带有Vue 3、TypeScrip和电影数据库(TMDB)API的SPA.

我目前正在处理一个404页面.

src\router\index.ts个人中,我有:

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import HomeView from '../views/HomeView.vue';
import TopRatedMoviesView from '../views/TopRatedMoviesView.vue';
import MovieDetailsView from '../views/MovieDetailsView.vue';
import ActorDetailsView from '../views/ActorDetailsView.vue';
import NotFoundView from '../views/NotFoundView.vue';

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/top-rated',
    name: 'top_rated',
    component: TopRatedMoviesView
  },
  {
    path: '/movie/:id',
    name: 'movie_details',
    component: MovieDetailsView
  },
  {
    path: '/actor/:id',
    name: 'actor_details',
    component: ActorDetailsView
  },
  {
    path: '/:pathMatch(.*)*',
    name: "404",
    component: NotFoundView
  },
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

src\views\NotFoundView.vue个人中,我有:

<template>
  <div class="container d-flex">
   <div class="text-center">
      <h1 class="mb-3">404 | page not found</h1>
      <router-link class="btn btn-sm btn-success" to="/">
        <strong>Go to the Homepege</strong>
      </router-link>
   </div>
  </div>
</template>

<script lang="ts">
  import { defineComponent } from 'vue';

  export default defineComponent({
    name: 'NotFoundView',

  });
</script>

当随机字符串紧跟在根URL http://localhost:8080/someNonExistingPath之后时,将显示404视图(不出所料).

但是,当向动态路由提供一个"坏"参数时,not也会发生同样的情况:http://localhost:8080/movie/a615656.

Stackblitz

我做错了什么?解决此问题的最可靠方法是什么?

推荐答案

可能的原因是当您访问/movie/a615656 URL时,它仍然满足路由参数/movie/:id.因为有时,id也可以包含非数字字符.

要解决此问题,您可以使用ROUTE REGEX筛选出非数字值,或手动抛出404视图.

例如,在您的getMovieDetails方法中,您可以查找非字母数字字符并抛出404视图.但这会导致不一致,因为即使在id满足的情况下,带有id的项在服务器端也可能不可用,所以最好的 Select 是在catch方法中抛出404,例如:

.catch((err) => {
    //log error
    console.log(err);
    //if the error status is 404
    if (err.response.status == 404) {
        router.push({ name: '404' })
    }
});

这可能会导致较小的延迟,因为您必须等待来自服务器的响应,但这是您应该这样做的方式.即使在Nuxt guide中,他们也提供了以下示例代码:

const route = useRoute()
const { data } = await useFetch(`/api/movies/${route.params.slug}`)
if (!data.value) {
  throw createError({ statusCode: 404, statusMessage: 'Page Not Found' })
}

这只是一个例子,如果您不熟悉NuxtJS,也不必担心

Javascript相关问答推荐

Angular material 表多个标题行映射

如何循环访问对象数组并以关键值形式获得结果?

主要内部的ExtJS多个子应用程序

如何获取转换字节的所有8位?

React:未调用useState变量在调试器的事件处理程序中不可用

我应该在redux reducer中调用其他reducer函数吗?

Angular中计算信号和getter的区别

在grafana情节,避免冲突的情节和传说

如何从html元素创建树 struct ?

如何从Intl.DateTimeFormat中仅获取时区名称?

我在Django中的视图中遇到多值键错误

使用Google API无法进行Web抓取

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

使用VUE和SCSS的数字滚动动画(&;内容生成)

使用带有HostBinding的Angular 信号来更新样式?

如何在我的Next.js项目中.blob()我的图像文件?

是否可以在Photoshop CC中zoom 路径项?

如何组合Multer上传?

ngOnChanges仅在第二次调用时才触发

如何在每隔2分钟刷新OKTA令牌后停止页面刷新