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

Next.js集成PostgreSQL注册时出现405 Method Not Allowed错误求助

Next.js App Router API路由405 Method Not Allowed问题解决

问题核心原因

你的项目采用Next.js App Router结构(API路由文件路径为src/app/api/auth/signup/route.ts),但你使用了Pages Router的API写法——默认导出handler函数。App Router要求API路由必须为每个HTTP方法导出对应的命名函数(如POST、GET),不能用默认导出。终端的提示已经明确指出这一点,这就是POST请求返回405的直接原因。

修正后的API路由代码

将route.ts代码改为App Router标准写法:

import prisma from "@/lib/prisma";
import { NextRequest, NextResponse } from "next/server";

export async function POST(request: NextRequest) {
  try {
    const { id, name, email, password } = await request.json();

    // 检查用户是否已存在
    const existingUser = await prisma.user.findUnique({
      where: { email },
    });

    if (existingUser) {
      return NextResponse.json({ error: 'User already exists' }, { status: 400 });
    }

    // 创建新用户(注意:务必哈希密码,禁止明文存储!)
    const newUser = await prisma.user.create({
      data: {
        id,
        name,
        email,
        password, // 建议使用bcrypt/argon2等库哈希后再存入
      },
    });

    return NextResponse.json(newUser, { status: 201 });
  } catch (error) {
    console.error(error);
    return NextResponse.json({ error: 'Server error' }, { status: 500 });
  }
}

关键改动说明:

  • 替换类型导入:使用NextRequest和NextResponse替代NextApiRequest/NextApiResponse(App Router标准类型)
  • 导出命名函数POST:Next.js会自动将POST请求映射到该函数,无需手动判断请求方法
  • 请求体读取:用await request.json()替代req.body(App Router的请求体读取方式)

前端代码小优化(可选)

在handleSubmit中添加响应处理,方便调试和用户反馈:

const handleSubmit = async (e: { preventDefault: () => void; }) => {
  e.preventDefault();

  try {
    const response = await fetch("/api/auth/signup", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ id, name, email, password }),
    });

    const result = await response.json();
    if (!response.ok) {
      alert(result.error); // 显示错误提示
      return;
    }
    alert("注册成功!"); // 注册成功反馈
  } catch (err) {
    alert("网络异常,请稍后重试");
  }
};

重要提醒

  • 密码安全:绝对禁止明文存储密码,推荐使用bcrypt或argon2库对密码进行哈希处理后再存入数据库。
  • 确保Prisma Schema中User模型的字段与创建用户时传入的id、name、email、password完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:30:54