Next.js 13 App目录下POST请求出现Error 500问题求助
问题原因
你用的是Next.js App Router的API路由(文件在app/api/下),但代码里误用了Pages Router的NextApiRequest/NextApiResponse类型和响应处理方式。App Router的API路由不提供res对象,而是通过返回NextResponse实例来处理响应,所以调用res.status会触发TypeError。
修复步骤
- 替换导入模块:把
NextApiRequest/NextApiResponse换成App Router专用的NextRequest和NextResponse(来自next/server) - 修改POST函数参数:只保留
req参数,移除res - 正确读取请求体:用
await req.json()获取POST数据,而非直接访问req.body - 替换响应方式:用
NextResponse.json()或NextResponse.error()返回结果,通过第二个参数设置状态码
修改后的完整路由代码
import bcrypt from "bcrypt"; import { NextRequest, NextResponse } from "next/server"; import prismadb from "@/lib/prismadb"; export async function POST(req: NextRequest) { try { const { email, password } = await req.json(); const existingUser = await prismadb.user.findUnique({ where: { email, }, }); if (existingUser) { return NextResponse.json( { error: "E-mail already exists. Login instead." }, { status: 422 } ); } const hashedPassword = await bcrypt.hash(password, 12); const user = await prismadb.user.create({ data: { email, hashedPassword, image: "", emailVerified: new Date(), }, }); return NextResponse.json(user, { status: 200 }); } catch (error) { return NextResponse.json( { error: `Something went wrong: ${error}` }, { status: 400 } ); } };
额外优化提示
你的组件代码里,密码不匹配的判断没有加return,会导致即使密码不一致,请求依然会发送:
// 原代码 if (password !== confirmPassword) Notifier("Passwords do not match", "error"); // 修改为 if (password !== confirmPassword) { Notifier("Passwords do not match", "error"); return; // 阻止后续请求发送 }
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

