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
相关产品推荐
相关产品推荐

