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

解决Next.js API路由中Axios异常导致的未处理运行时错误

Next.js API路由中自行处理Axios 4xx错误,避免未处理运行时错误

我在Next.js中创建API路由,用于向后端发送请求并在Cookie中存储令牌。当前功能能正常运行,但4xx响应会触发未处理的运行时错误,我希望自行处理该错误,而非使用默认提示。错误提示如下:

未处理运行时错误
AxiosError: 请求失败,状态码400

当前API路由代码:

import { signIn } from '@/services/auth'
import { NextApiRequest, NextApiResponse } from 'next'

export default async function signInHandler (req: NextApiRequest, res: NextApiResponse) {
  const { userName, password } = req.body
  const response = await signIn({ userName, password }).catch(e => e.response)
  if (response.status === 200) {
    // save token in cookies
  }
  return res.status(response.status).json(response.data)
}

signIn及Axios实例配置代码:

// signIn
export const signIn = ({ userName, password }: {userName: string, password: string}) =>
  api.post(`${baseEndpoint}/sign-in`, { userName, password })

// api
export const api = axios.create({
  baseURL: baseApiUrl,
  headers: {
    'Content-Type': 'application/json'
  }
})

Next运行时错误


解决方案

问题核心是Axios默认会对4xx/5xx响应抛出错误,而你当前的catch(e => e.response)仅处理了有response属性的错误,一旦出现无响应的异常(比如网络中断),response会变为undefined,后续访问response.status会触发新的未捕获错误,导致Next.js抛出运行时提示。可以通过两种方式解决:

方式1:完善API路由的全量错误捕获

直接用try/catch包裹逻辑,覆盖所有错误场景:

import { signIn } from '@/services/auth'
import { NextApiRequest, NextApiResponse } from 'next'

export default async function signInHandler(req: NextApiRequest, res: NextApiResponse) {
  try {
    const { userName, password } = req.body
    const response = await signIn({ userName, password })
    
    if (response.status === 200) {
      // 示例:将令牌存入HttpOnly Cookie
      // res.setHeader('Set-Cookie', `authToken=${response.data.token}; Path=/; HttpOnly; Secure`)
    }
    
    return res.status(response.status).json(response.data)
  } catch (error: any) {
    // 分场景处理错误
    if (error.response) {
      // 后端返回4xx/5xx响应
      return res.status(error.response.status).json(error.response.data)
    } else if (error.request) {
      // 请求已发送但无响应(网络问题)
      return res.status(500).json({ message: '无法连接到后端服务' })
    } else {
      // 请求初始化阶段的错误
      return res.status(500).json({ message: error.message })
    }
  }
}

方式2:全局配置Axios不抛出4xx错误

如果希望Axios把4xx响应当作成功请求处理,可在创建实例时修改validateStatus规则:

export const api = axios.create({
  baseURL: baseApiUrl,
  headers: {
    'Content-Type': 'application/json'
  },
  validateStatus: (status) => {
    // 仅当状态码≥500时才抛出错误
    return status < 500
  }
})

配置后,4xx响应会直接进入then回调,无需额外捕获,你可以直接通过response.status判断处理逻辑。

内容的提问来源于stack exchange,提问作者Martin Pilaszek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:40:29