You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS获取单个元素时id返回undefined问题求助

问题解决:NextJS API路由中动态参数undefined

你的问题出在NextJS动态路由参数的获取方式和JSON Server不同,具体修正如下:

1. 修正参数获取逻辑

NextJS中,pages/api/events/[id].js这类动态路由的参数,直接存放在req.query的顶层属性里,而非req.query.params。你需要把代码里的req.query.params.id改成req.query.id。

另外注意:req.query.id是字符串类型,如果你的db.json里id是数字类型,直接用===全等比较会匹配失败,需要转成数字再比较。

修正后的代码:

const { events } = require('../../../db.json')

const handler = async (req , res) => {
    const method = req.method;
    // 修正参数获取+类型转换
    const evt = events.filter((ev) => ev.id === parseInt(req.query.id)); 

    if(method === 'GET'){
        // GET请求成功状态码用200,201是资源创建成功的状态码
        return res.status(200).json(evt);
    } else {
        res.setHeader('Allow', ['GET']);
        res.status(405).json({message:`Method ${method} is not allowed`})
    }
    
}

export default handler;

2. 为什么JSON Server可以正常工作?

JSON Server有自己的路由解析逻辑,它会把URL中的动态参数封装到req.params对象里,所以你访问/api/events/1时能通过req.params.id拿到值。但NextJS的API路由遵循自身规则,动态参数直接挂载在req.query上,这是两者的核心差异。

额外优化点

  • GET请求成功时建议用200状态码,201通常用于POST请求创建资源成功的场景,更符合HTTP规范。
  • 如果需要返回单个元素而非数组,可以用find代替filter:filter会返回匹配的所有元素组成的数组,find只返回第一个匹配的元素,更贴合"获取指定元素"的需求:
    const evt = events.find((ev) => ev.id === parseInt(req.query.id));
    

内容的提问来源于stack exchange,提问作者tukitooo1998

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:50:19