javascript 找不到API路由

brc7rcf0  于 2024-01-05  发布在  Java
关注(0)|答案(6)|浏览(133)

在我的Next.js项目中,我有main/app/api/worker-callback/route.ts文件:

import { NextApiResponse } from "next";
import { NextResponse } from "next/server";

type ResponseData = {
    error?: string
};

export async function POST(req: Request, res: NextApiResponse<ResponseData>) {
    if (req.headers.get('Authorization') !== process.env.BACKEND_SECRET!) {
        res.status(403).json({ error: "Allowed only by backend" });
        // return Response.json({ error: "Allowed only by backend" }, { status: 403 });
    }
    return NextResponse.json({});
}

字符串
但是当我查询它的时候,我得到了错误404。为什么?

curl -d '' -v -o/dev/null -H "accept: application/json" http://localhost:3000/api/worker-callback
...
< HTTP/1.1 404 Not Found
...


请注意,main/app中的HTML页面工作得很好,我用cd main && next build命令构建它。

ldfqzlk8

ldfqzlk81#

问题似乎是你发送的是GET请求而不是你在API中定义的POST。你可能想添加-X POST来发送POST请求。

mrwjdhj3

mrwjdhj32#

可能的问题:
1.路由配置:确认main/app/api/worker-callback/route.ts文件位于正确的目录(pages/api IIRC)中,以便Next.js将其识别为API路由。
1.函数导出:您可能需要尝试导出为默认值(export default async function...),而不是命名的POST导出。
还要仔细检查服务器是否正在运行,URL是否正确,next build是否正确完成。

6qfn3psc

6qfn3psc3#

根据您在问题中提供的代码片段,路由处理程序似乎存在许多问题:

  • 路由处理程序不再接收第二个res参数。
  • 路由处理程序应该返回NextResponse类型的promise。
  • 渴望返回中的响应语法无效。
  • 您在渴望返回中缺少return关键字
import { type NextRequest, NextResponse } from "next/server";

export async function POST(request: NextRequest): Promise<NextResponse> {
  if (request.headers.get("Authorization") !== process.env.BACKEND_SECRET!) {
    // should also be an instance of NextResponse and you were missing a return here
    return NextResponse.json({ error: "Allowed only by backend" }, { status: 403 });
  }

  return NextResponse.json({ message: "Hello from the backend" });
}

字符串
我已经在本地测试了我的代码片段,通过添加我提出的更改,它将按照预期工作。我强烈建议您阅读route handlers上的文档,因为它们更改了很多。

w3nuxt5m

w3nuxt5m4#

export async function POST(req: Request, res: NextApiResponse<ResponseData>) {
    if (req.headers.get('Authorization') !== process.env.BACKEND_SECRET!) {
        return Response.json({ message: 'Allowed only by backend' });
    } else {
        return Response.json({ message: 'Hello from Next.js!' })
    }
}

字符串

n3schb8v

n3schb8v5#

您是否从正确的根文件夹运行了构建脚本?

3lxsmp7m

3lxsmp7m6#

API route文件名应该与它处理的HTTP方法匹配,例如get.tspost.tsput.ts等。但是,在您的代码中,您使用route.ts作为文件名,这不是有效的HTTP方法。这可能会导致Next.js无法将该文件识别为API路由并返回404错误。

要解决这个问题,您需要为API路由使用正确的文件名。您应该将route.ts文件重命名为post.ts,因为您在代码中处理的是POST方法。
例如,可以使用以下命令重命名文件:

mv main/app/api/worker-callback/route.ts main/app/api/worker-callback/post.ts

字符串
然后,您可以使用与之前相同的URL查询API路由:

curl -d '' -v -o/dev/null -H "accept: application/json" http://localhost:3000/api/worker-callback


如果请求被授权,您应该得到200 OK响应,如果请求未被授权,则应该得到403 Forbidden响应。

相关问题