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

Next.js动态路由测试异常:传ID返回全部用户问题求助

问题解决步骤

核心问题

你把两个接口的逻辑完全写反了:

  • 标注为「查询单个用户」的代码里,实际用prisma.user.findMany()查询了全部用户
  • 标注为「查询全部用户」的代码里,实际是通过userId查询单个用户的逻辑

另外,你混用了Next.js App Router(route.ts)和旧Pages Router的写法,参数获取、类型导入都存在错误,这也是导致动态路由失效的原因。


正确代码实现

1. 查询全部用户接口(路径:app/api/users/route.ts)

import { NextResponse } from "next/server";
import prisma from '@/libs/prismadb'

export async function GET() {
  try {
    const users = await prisma.user.findMany({
      orderBy: {
        createdAt: 'desc'
      }
    })
    return NextResponse.json({ message: users, status: 200 })
  } catch (error) {
    console.error(error)
    return NextResponse.json({ message: '查询失败', status: 400 })
  }
}

2. 查询单个用户的动态路由接口(路径:app/api/users/[userId]/route.ts)

import { NextResponse } from "next/server";
import prisma from '@/libs/prismadb'

// App Router中动态路由参数通过第二个context对象获取
export async function GET(_req: Request, { params }: { params: { userId: string } }) {
  try {
    const { userId } = params

    if (!userId || typeof userId !== 'string') {
      throw new Error('用户ID无效')
    }

    const existingUser = await prisma.user.findUnique({
      where: {
        id: userId
      }
    })

    return NextResponse.json({ message: existingUser, status: 200 })
  } catch (error) {
    console.error(error)
    return NextResponse.json({ message: '查询失败', status: 400 })
  }
}

关键修正点

  • 路径匹配:动态路由必须放在[userId]命名的文件夹下的route.ts中,Next.js才会识别userId参数
  • 参数获取:App Router的动态路由参数从GET函数的第二个参数context.params获取,而非req.query
  • 逻辑对应:查单个用户用findUnique,查全部用findMany,避免逻辑混淆
  • 响应返回:所有NextResponse.json()必须加return,否则接口会返回默认空响应
  • 类型修正:App Router不需要导入NextApiRequest/NextApiResponse,直接用标准Request类型即可

内容的提问来源于stack exchange,提问作者Satya sai Subash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:47:56