【发布时间】:2021-09-07 23:41:03
【问题描述】:
我正在使用 NextJS 将 CSV 数据转换为静态页面。每个页面都是pages/[slug].jsx。我在 [slug].jsx getStaticPaths() 和 getStaticProps() 函数内的 slug 值上调用 toLowerCase()。生成的页面是小写的。例如/ab101、/ab102、/cc500 都解析到 pages/[slug].jsx 页面。
不幸的是,人们可能手动输入 url,并且可能使用大写或混合大小写作为 slug 值,目前导致 404。
问题:如何使路由对 slug 值不区分大小写?
更新
当我从getStaticPaths() 返回fallback: true 时,即使没有完全匹配的路径,我的[slug].jsx 文件也会被命中。然后我可以检查isFallback,如下面的 Anish Antony 所示。
此外,当找不到页面时,传递给我的页面的 items 参数将是未定义的。路由器的pathname 值是"/[slug]" 而不是“slug”的值。但是,有一个 asPath 值包含有用的数据,例如/mixedCaseSlug?param=value&foo=bar.
当页面呈现时,我检查它是否是一个后备。如果是,则显示 LOADING... 消息。接下来将显示它并调用 getStaticProps() 来生成“缺失”页面。然后,您将使用页面数据重新渲染。如果 getStaticProps 无法获取页面数据,我会推送一条路径,该路径将通向内置的 404 页面。
export default function Page({ item }) {
const { isFallback, push } = useRouter()
const hasPageData = item && Object.keys(item).length > 0
useEffect(() => {
if (!isFallback && !hasPageData) {
push('/page-not-found/error')
}
}, [isFallback, hasPageData])
const loadingMsg = <div>Loading...</div>
const notFoundMsg = <div>Page not found</div>
return isFallback ? loadingMsg : hasPageData ? <Item item={item} /> : notFoundMsg
}
我需要将getStaticProps() 更新为小写slug 参数,因为它现在可能是大小写混合,但我们想找到我们的页面数据。而且我需要考虑到确实没有 slug 数据的情况。
export async function getStaticProps({ params }) {
const { slug } = params
const item = data.find(o => o.Practice_Code.trim().toLowerCase() === slug.toLowerCase())
return {
props: {
item: item ? item : {}
}
}
}
这一切看起来都很笨拙,所以我仍然想知道是否有更好的方法。
【问题讨论】:
标签: next.js url-routing