代码之家  ›  专栏  ›  技术社区  ›  hasratyan

Next.js 15 API路由-动态路由中的无效GET导出错误[id]

  •  0
  • hasratyan  · 技术社区  · 4 月前

    我正在使用应用程序路由器(/App/api/)进行Next.js 15项目,并试图实现一个动态的api路由(/api/agents/[id]),以从MongoDB获取特定的代理。

    然而,在npm运行构建过程中,我遇到了这个TypeScript错误: src/app/api/agents/[id]/route.ts 类型错误:路由“src/app/api/agents/[id]/Route.ts”的“GET”导出无效: 类型“{params:{id:string;};}”不是函数第二个参数的有效类型。

    到目前为止我所尝试的:

    1. 修改了GET、PATCH和DELETE请求的函数签名:

    export async function GET(req: NextRequest, context: { params: { id: string } }) {

    仍然收到无效的GET导出错误。

    1. 将参数类型更改为记录<string,string>:

    export async function GET(req: NextRequest, context: { params: Record<string, string> }) {

    运气不好。

    1. 尝试将参数包装在可选对象中:

    export async function GET(req: NextRequest, context: { params?: { id?: string } }) {

    仍然会出现同样的错误。

    1. 检查tsconfig.json中的TypeScript兼容性:
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    

    没有改善。

    1. 在使用之前尝试等待参数:

    const { id } = await context.params;

    仍然不起作用。

    以下是我的API路线代码(/app/API/agents/[id]/Route.ts)

    import { NextRequest, NextResponse } from "next/server";
    import { connectToDatabase } from "@/utils/db";
    import Agency from "@/models/agency";
    import mongoose from "mongoose";
    
    // Helper function for error responses
    const errorResponse = (message: string, status: number) => {
      return NextResponse.json({ error: message }, { status });
    };
    
    // GET: Fetch a Single Agency by ID (Fails on Build)
    export async function GET(
      req: NextRequest,
      context: { params: { id: string } }
    ) {
      try {
        await connectToDatabase();
    
        // Validate ID format
        if (!context.params || !context.params.id || !mongoose.isValidObjectId(context.params.id)) {
          return errorResponse("Invalid agency ID", 400);
        }
    
        const agency = await Agency.findById(context.params.id).lean();
        if (!agency) {
          return errorResponse("Agency not found", 404);
        }
    
        return NextResponse.json({ ...agency, id: String(agency._id) });
      } catch (error) {
        console.error("❌ Error fetching agency:", error);
        return errorResponse("Failed to fetch agency", 500);
      }
    }
    

    我的环境:

    • Next.js版本:15.1.6
    • Node.js版本:22
    • TypeScript版本:5.4
    • 数据库:MongoDB(Mongoose ORM)

    任何见解都将不胜感激!

    1 回复  |  直到 4 月前
        1
  •  0
  •   ckoala    4 月前

    Nextjs文档 """ 上下文(可选)

    params:一个promise,解析为一个包含当前路由的动态路由参数的对象。

        export async function GET(
          request: Request,
          { params }: { params: Promise<{ team: string }> }
        ) {
          const team = (await params).team
        }
    

    """

    https://nextjs.org/docs/app/api-reference/file-conventions/route