当前位置: 首页 > news >正文

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 用得少的缘故。

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

相关文章:

  • 【二刷力扣】【力扣热题100】今天的题目是:283.移动零
  • 2025.5.22 Axure 基础与线框图制作学习笔记
  • 大数据Spark(六十):Spark On Yarn 配置
  • 软件工程重点复习
  • C++学习之打车软件—高德地图API
  • 图解 | 大模型智能体LLM Agents
  • 网络原理入门详解:从零理解互联网如何工作
  • mysql知识点1--了解数据库
  • c/c++的opencv椒盐噪声
  • 学习日志12 java
  • 【IPMV】图像处理与机器视觉:Lec12 Blob Detector 斑点检测
  • MLA:Transformer的智能变形金刚——解密多头潜在注意力的进化密码
  • DOM事件的传播机制
  • Dify 本地源码安装教程
  • Llama 4中文调优全流程解
  • Win11 系统登入时绑定微软邮箱导致用户名欠缺
  • ST表——算法的优化
  • LambdaQueryWrapper、MybatisPlus提供的基本接口方法、增删改查常用的接口方法、自定义 SQL
  • QML学习06Button
  • ArrayList 与 LinkedList 区别?
  • 做电影网站程序好用吗/网站源码建站
  • 莆田高端模板建站/有广告位怎么找广告商
  • 室内设计网站模板/广东百度推广的代理商
  • 网站分类目录大全/今天新闻头条新闻
  • 家居装修企业网站源码/免费企业建站
  • 中国建设购物网站/刚刚突发1惊天大事