我目前正在尝试使用Next.js 13和app
文件夹创建一个动态路由,我的请求是我想定义一些静态路由,如果slug与我输入的内容不匹配,它将返回404页面
这是我在13.0.5
和pages
文件夹下一个版本所做的,这是工作很好,如果我要去一个不存在的页面,如/pages/post/foo
,我被重定向到404页
// pages/post/[id].tsx
import { useRouter } from "next/router";
const Post = () => {
const router = useRouter();
const { id, foo } = router.query;
return (
<div>
<p>Post: {id}</p>
</div>
);
};
export const getStaticProps = () => ({
props: {},
});
export const getStaticPaths = () => ({
paths: [{ params: { id: "abc" } }, { params: { id: "abcd" } }],
fallback: false,
});
export default Post;
现在我尝试对app
文件夹和这个版本的Next.js 13.4.4
做同样的事情
// app/[locale]/post/[id].tsx
export const dynamicParams = false;
export const generateStaticParams = async () => [{ id: "abc" }, { id: "abcd" }];
const Post = ({ params: { id } }) => (
<div>
<p>Post: {id}</p>
</div>
);
export default Post;
但问题是它根本不工作,我的意思是动态路由工作,但如果我尝试类似/post/foo
的东西,它不会显示404页面我正在使用next-intl
进行区域设置更改
我想的一个解决办法是这样做
import { notFound } from "next/navigation";
const Post = ({ params: { id } }) => {
if (!['abc', 'abcd'].includes(id)) notFound();
return (/* ... */);
};
但我想知道是否有更好的解决方案,提前感谢!
2条答案
按热度按时间qnzebej01#
https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config
https://nextjs.org/docs/app/api-reference/file-conventions/not-found
您可以使用
dynamic
和dynamicParams
的组合,并结合路由所在文件夹中的not-found.tsx
来实现此效果。quhf5bfb2#
如果你使用getStaticProps:
如果您正在使用get ServerSideProps: