Next.js 13.4 App Router API路由问题:注册组件请求体未定义及res.status报错
问题原因与解决方案
你的问题核心是混淆了Next.js App Router和Pages Router的API路由写法。Next.js 13.4的App Router(app目录下的route.ts)采用Web标准的Request/Response API,而你用的是Pages Router(pages/api下文件)的NextApiRequest/NextApiResponse类型和响应逻辑,直接导致两个问题:
req.body未解析:App Router不会自动解析请求体,必须手动调用方法获取数据res.status不存在:App Router的API路由无需res参数,直接返回Response对象即可
修正步骤
- 移除Pages Router相关依赖:删除
NextApiRequest/NextApiResponse的导入语句 - 手动解析请求体:在函数开头通过
await req.json()获取前端发送的JSON数据 - 改用Web标准Response返回结果:用
Response.json()或new Response()设置状态码和响应内容
修改后的完整代码
import argon2 from 'argon2' import { RowDataPacket, ResultSetHeader } from 'mysql2' import database from '../database' export async function POST(req: Request) { console.log('API Request received:', req.method, req.url) // 手动解析请求体 const body = await req.json() console.log('Solicitud recibida con datos:', body) const { firstName, lastName, email, password } = body console.log('Received data:', { firstName, lastName, email }) if (typeof password !== 'string' || password.trim() === '') { console.log('Password validation failed') return Response.json( { message: 'Password is required and must be a string.' }, { status: 400 } ) } try { console.log('Querying for existing users with email:', email) const [existingUsers] = await database.query<RowDataPacket[]>( 'SELECT id FROM Users WHERE email = ?', [email], ) console.log('Query result:', existingUsers) if (existingUsers.length > 0) { console.log('Email already in use') return Response.json( { message: 'Email already in use.' }, { status: 409 } ) } console.log('Hashing password') const hashedPassword = await argon2.hash(password) console.log('Inserting new user into database') const [result] = await database.query<ResultSetHeader>( 'INSERT INTO Users (first_name, last_name, email, hashed_password) VALUES (?, ?, ?, ?)', [firstName, lastName, email, hashedPassword], ) console.log('Insert query result:', result) if (result.affectedRows === 0) { console.log('User could not be created') return new Response('User could not be created.', { status: 400 }) } console.log('User created successfully:', result.insertId) return Response.json( { message: 'User created.', userId: result.insertId }, { status: 201 } ) } catch (error) { console.error('Error occurred:', error) return new Response('Internal Server Error', { status: 500 }) } }
额外检查点
- 确保API路由文件路径符合App Router规范:比如注册接口需放在
app/api/auth/register/route.ts这类路径下 - 确认前端请求的
Content-Type为application/json(使用fetch发送JSON数据时默认会自动设置,无需手动额外配置)
内容的提问来源于stack exchange,提问作者kelvin
相关产品推荐
相关产品推荐

