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

Vercel部署Next.js 15时路由API第二个参数类型错误求助

修复Next.js App Router动态路由GET函数的类型错误

错误信息

类型错误:路由“src/app/api/student/[studentId]/route.ts”的“GET”导出无效:类型“{ params: { studentId: string; }; }”不是该函数第二个参数的有效类型。

问题原因

在Next.js App Router中,路由函数的context参数必须匹配框架官方定义的类型结构,手动直接声明{ params: { studentId: string } }会和内部类型校验冲突。

修复方案

有两种可行的修复方式,按需选择:

方式1:使用官方Params泛型类型

从next/navigation导入官方提供的Params类型,用它约束params的结构,确保类型完全兼容:

import { NextRequest, NextResponse } from 'next/server';
import { Params } from 'next/navigation';

export async function GET(
  req: NextRequest,
  context: { params: Params<{ studentId: string }> }
) {
  const { studentId } = context.params;

  try {
    const student = await prisma.students.findUnique({
      where: { id: parseInt(studentId, 10) },
    });

    if (!student) {
      return NextResponse.json({ error: "Student not found" }, { status: 404 });
    }

    const formattedStudent = {
      ...student,
      birthDate: student.birthDate ? formatDate(student.birthDate) : null,
      accommodationStart: student.accommodationStart
        ? formatDate(student.accommodationStart)
        : null,
      courseStart: student.courseStart ? formatDate(student.courseStart) : null,
      accommodationEnd: student.accommodationEnd
        ? formatDate(student.accommodationEnd)
        : null,
      courseEnd: student.courseEnd ? formatDate(student.courseEnd) : null,
      arrivalDate: student.arrivalDate ? formatDate(student.arrivalDate) : null,
      departureDate: student.departureDate
        ? formatDate(student.departureDate)
        : null,
    };

    return NextResponse.json(formattedStudent, { status: 200 });
  } catch (error: unknown) {
    console.error(
      "Error fetching student:",
      error instanceof Error ? error.message : error
    );
    return NextResponse.json(
      {
        error: "Failed to fetch student",
        details:
          error instanceof Error ? error.message : "An unknown error occurred",
      },
      { status: 500 }
    );
  }
}

方式2:解构参数并直接指定类型

通过解构context参数,直接给params指定类型,简化代码的同时通过类型校验:

import { NextRequest, NextResponse } from 'next/server';

export async function GET(
  req: NextRequest,
  { params }: { params: { studentId: string } }
) {
  const { studentId } = params;

  // 后续业务逻辑代码保持不变
  try {
    const student = await prisma.students.findUnique({
      where: { id: parseInt(studentId, 10) },
    });

    if (!student) {
      return NextResponse.json({ error: "Student not found" }, { status: 404 });
    }

    const formattedStudent = {
      ...student,
      birthDate: student.birthDate ? formatDate(student.birthDate) : null,
      accommodationStart: student.accommodationStart
        ? formatDate(student.accommodationStart)
        : null,
      courseStart: student.courseStart ? formatDate(student.courseStart) : null,
      accommodationEnd: student.accommodationEnd
        ? formatDate(student.accommodationEnd)
        : null,
      courseEnd: student.courseEnd ? formatDate(student.courseEnd) : null,
      arrivalDate: student.arrivalDate ? formatDate(student.arrivalDate) : null,
      departureDate: student.departureDate
        ? formatDate(student.departureDate)
        : null,
    };

    return NextResponse.json(formattedStudent, { status: 200 });
  } catch (error: unknown) {
    console.error(
      "Error fetching student:",
      error instanceof Error ? error.message : error
    );
    return NextResponse.json(
      {
        error: "Failed to fetch student",
        details:
          error instanceof Error ? error.message : "An unknown error occurred",
      },
      { status: 500 }
    );
  }
}

说明

  • 方式1严格遵循Next.js官方类型规范,适合需要明确类型约束的大型项目;
  • 方式2代码更简洁,适合快速修复场景,类型校验同样有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:54:54