欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > Next.js V15 在异步页面中,获取路由动态参数的几个坑

Next.js V15 在异步页面中,获取路由动态参数的几个坑

2025/11/2 4:58:57 来源:https://blog.csdn.net/FungLeo/article/details/148211257  浏览:    关键词:Next.js V15 在异步页面中,获取路由动态参数的几个坑

前言

最近几天用 next.js 开发了一个小项目,之前的项目基于 next.js 时,我都是使用的 jsx 的方式进行开发。而这次给客户升级,我升级为了 tsx 的方式进行开发,并且把 next.js 升级到了最新的 v15 版本。在开发过程中,遇到几个小坑,这里记录一下。

NEXTJS

目录构建

好,我的 nextjs APP 的目录构建如下所示:

src/app
├── article
│   └── [id]
│       └── page.tsx
├── channel
│   └── [id]
│       ├── [page]
│       │   └── page.tsx
│       └── page.tsx
├── layout.tsx
└── single└── [id]└── page.tsx

好,以上路径匹配路由为

# 首页
/
# 栏目页面
/channel/[id]
# 栏目分页页面
/channel/[id]/[page]
# 文章页面
/article/[id]
# 其他省略。

坑1,在页面中获取动态 id 失败

一开始,我用一下代码获取动态 id,结果获取失败。

export type PageChannelParamsTypes = {params: {id: stringpage?: string}
}export default async ({ params }: PageChannelParamsTypes) => {const { id, page: paramPage = 0 } = params//...
}

用 DeepSeek 和 Claude 3.5 两个 AI 问了半天,都解决不了,无奈,查询官方文档,最终解决了问题。调整后的代码如下:

export type PageChannelParamsTypes = {params: {id: stringpage?: string}
}export default async ({ params }: PageChannelParamsTypes) => {const { id, page: paramPage = 0 } = await params//...
}

OK, 终于可以获得 id 等参数了。我告诉 DeepSeek ,这里需要加一个 await ,DeepSeek 跟我犟嘴,非说我的代码是错误的。。。。

不管它,终于跑起来了。

坑2, 在编译过程中,提示出现失败

终于,把项目开发差不多了,准备编译一下,开心的运行了 pnpm run build 命令,然后我心拔凉拔凉的,编译失败,有如下报错:

 next build▲ Next.js 15.1.8Creating an optimized production build ...✓ Compiled successfullyLinting and checking validity of types  ...Failed to compile.src/app/article/[id]/page.tsx
Type error: Type 'PageParamsTypes' does not satisfy the constraint 'PageProps'.Types of property 'params' are incompatible.Type '{ id: string; }' is missing the following properties from type 'Promise<any>': then, catch, finally, [Symbol.toStringTag]Next.js build worker exited with code: 1 and signal: null

继续问 AI,答非所问,乱改一通。全部拒绝后,再次翻阅官方文档,终于解决了问题,最终代码如下:

export type PageChannelParamsTypes = {params: Promise<{id: stringpage?: string}>
}export default async ({ params }: PageChannelParamsTypes) => {const { id, page: paramPage = 0 } = await params//...
}

在类型定义的时候,需要给 id 和 page 这个对象,包裹上 Promise 才能通过编译。并且,在编辑器里,不再提示这个 await 是多余的了。

编译结果
最终顺利通过编译。

官方文档

官方文档地址如下:https://nextjs.org/docs/app/api-reference/file-conventions/page#params-optional
官方文档截图

小结

有时候,尤其是 AI 开始瞎编乱造时,一定要查阅官方文档,不能过度信赖 AI。

也怪我自己看得不仔细,第一次看的时候,只注意到了 await,没注意到上面还有一个 Promise 最终在一个坑里被埋了两次。

哎~还是自己用 nextjs 用得少的缘故。

各位看官,你在开发的过程中遇到过什么坑呢,欢迎在评论区交流!顺便用发财的小手点一下赞吧!谢谢!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词