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
相关产品推荐
相关产品推荐

