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

Next.js使用API Routes时出现"Method not allowed"错误如何解决?

解决Next.js App Router API Routes 405 Method Not Allowed错误及相关问题

核心问题分析

你遇到的405错误,本质是App Router的API路由写法不符合规范,同时前端请求格式和后端Pinata调用也存在格式冲突问题,以下是分步修复方案:


1. 修正API路由的写法(解决405错误的关键)

Next.js App Router的API路由要求导出对应HTTP方法的异步函数(如POST、GET),而非Pages Router的默认handler函数。旧写法在App Router中无法被识别为POST请求的处理逻辑,因此返回405错误。

修改app/api/pinToIPFS/route.js为以下代码:

export async function POST(request) {
  try {
    // 正确获取前端传来的FormData
    const formData = await request.formData();
    
    const JWT = process.env.PINATA_JWT;
    const response = await fetch("https://api.pinata.cloud/pinning/pinFileToIPFS", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${JWT}`,
        // 无需手动设置Content-Type,fetch会自动处理multipart/form-data格式
      },
      body: formData,
    });

    const data = await response.json();
    return Response.json(data, { status: 200 });
  } catch (error) {
    console.error("Error pinning file to IPFS:", error);
    return Response.json({ error: "Error pinning file to IPFS" }, { status: 500 });
  }
}

// 若需处理其他方法,可导出对应函数(如GET),避免返回405
export async function GET() {
  return Response.json({ error: "Method not allowed" }, { status: 405 });
}

2. 修正前端fetch请求的格式问题

前端传递FormData时,手动设置Content-Type: application/json会导致请求格式冲突,浏览器无法正确解析表单数据。移除该头后,浏览器会自动添加multipart/form-data; boundary=xxx的正确请求头。

修改page.tsx中的handleSubmit函数:

const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
  e.preventDefault();

  const formData = new FormData();
  formData.append(
    "file",
    new Blob([JSON.stringify(form)], { type: "application/json" })
  );

  try {
    const res = await fetch("/api/pinToIPFS", {
      method: "POST",
      // 移除手动设置的Content-Type,让浏览器自动处理
      body: formData,
    });

    // 新增非2xx状态码的错误处理
    if (!res.ok) {
      const errorData = await res.json();
      throw new Error(errorData.error || "Request failed");
    }

    const resData = await res.json();
    console.log("resData:", resData);
  } catch (error) {
    console.error("Error uploading file:", error);
    alert("Trouble uploading file");
  }
};

3. 修正Pinata API调用的格式

Pinata的pinFileToIPFS接口要求使用multipart/form-data格式上传文件,直接传递FormData即可,无需手动设置Content-Type,fetch会自动处理边界符等细节,确保请求符合Pinata的接口规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:07:40