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

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对象即可

修正步骤

  1. 移除Pages Router相关依赖:删除NextApiRequest/NextApiResponse的导入语句
  2. 手动解析请求体:在函数开头通过await req.json()获取前端发送的JSON数据
  3. 改用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:40:07