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

Next.js API动态路由无法获取对象ID的问题求助

问题分析与解决方案

你的代码无法找到目标文章的核心原因是数据结构层级理解错误,以及查找逻辑未匹配实际数据结构:

  • 从data.js的结构来看,Trending数组的每个元素是包含data(文章数组)和meta(分页信息)的对象,文章的id并不在Trending的直接元素上,而是嵌套在value.data数组的子对象中。
  • req.query.postId是字符串类型,而文章的id是数字类型,虽然==能隐式转换,但显式转换更严谨,可避免潜在bug。

修正后的[postId].js代码

import data from "../data"

export default function handler(req,res){
    const{ postId }= req.query;
    const { Trending } = data;
    
    if(postId){
        let targetPost = null;
        // 遍历每个Trending分组
        for (const trendItem of Trending) {
            // 在当前分组的文章数组中查找匹配id的内容
            const found = trendItem.data.find(item => item.id === Number(postId));
            if (found) {
                targetPost = found;
                break;
            }
        }

        if (targetPost) {
            return res.status(200).json(targetPost);
        }
    }
    
    return res.status(404).json({ error:"Post Not Found"})
}

代码说明

  1. 遍历Trending数组的每个分组项,每个分组都包含data文章数组
  2. 用Number(postId)将字符串类型的postId转为数字,和文章的数字id做严格相等匹配(===)
  3. 找到目标文章后立即终止遍历并返回结果,避免不必要的计算
  4. 若遍历完所有分组都未找到匹配项,返回404

简化写法(适用于Trending仅一个分组的场景)

如果你的Trending数组始终只有一个元素,可简化查找逻辑:

import data from "../data"

export default function handler(req,res){
    const{ postId }= req.query;
    const { Trending } = data;
    
    if(postId){
        const post = Trending[0].data.find(item => item.id === Number(postId));
        return post ? res.status(200).json(post) : res.status(404).json({ error:"Post Not Found"});
    }
    
    return res.status(404).json({ error:"Post Not Found"})
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:15:40