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

Next.js使用Axios请求Laravel Lumen接口并在组件展示返回数据实现问题

修复步骤

你现有代码存在3处需要调整的问题,按以下步骤修改即可正常获取并展示接口响应:

1. 先修复接口封装层的逻辑问题

原有services/index.tsx的错误处理逻辑会吞掉异常,导致请求失败时也不会进入调用方的catch分支,同时多余的await可以去掉,推荐两种优化方案二选一:

方案A:抛出异常,保持正常的Promise rejected状态

export const register = async (payload: any) => {
  try {
    const endpoint = baseUrl + '/api/register';
    const res = await Axios.post(endpoint, payload)
    // res.data已经是axios解析完成的响应体,无需额外加await
    return res.data
  } catch (error: any) {
    // 抛出错误,让外层调用方可通过catch捕获
    throw error.response
  }
}

方案B:统一返回结构,无需外层处理异常

如果不想用try/catch,可以统一返回标准结构,调用方直接判断状态即可:

export const register = async (payload: any) => {
  try {
    const endpoint = baseUrl + '/api/register';
    const res = await Axios.post(endpoint, payload)
    return {
      success: true,
      data: res.data
    }
  } catch (error: any) {
    return {
      success: false,
      error: error.response
    }
  }
}

2. 调整signup.tsx的调用与展示逻辑

需要新增React状态存储响应消息,同时修正变量名错误,以下是完整适配代码(适配上面的方案A):

import { useState } from 'react'
import { useFormik } from 'formik'
import { register } from '@/services'

export default function Signup() {
  // 新增状态存储响应信息,用于页面渲染展示
  const [successMessage, setSuccessMessage] = useState('')
  const [errorMessage, setErrorMessage] = useState('')

  const formik = useFormik({
    initialValues: {
      email: '',
      // 补充你的其他表单字段
    },
    onSubmit: async (values) => {
      // 每次提交前清空历史消息
      setSuccessMessage('')
      setErrorMessage('')
      try {
        const res = await register(values)
        // 赋值成功消息,Lumen返回的结构直接取message字段
        setSuccessMessage(res.message)
      } catch (err: any) {
        // 处理Lumen返回的校验错误/其他错误
        if (err?.status === 422 && err?.data?.errors) {
          // 表单校验错误(比如邮箱已存在、必填),拼接所有错误提示
          const errorList = Object.values(err.data.errors).flat()
          setErrorMessage(errorList.join('、'))
        } else {
          // 其他错误场景
          setErrorMessage(err?.data?.message || '注册失败,请稍后重试')
        }
      }
    }
  })

  return (
    <div>
      {/* 展示成功提示 */}
      {successMessage && <p style={{ color: '#2ecc71' }}>{successMessage}</p>}
      {/* 展示错误提示 */}
      {errorMessage && <p style={{ color: '#e74c3c' }}>{errorMessage}</p>}

      {/* 你的表单代码 */}
      <form onSubmit={formik.handleSubmit}>
        <div>
          <label>邮箱</label>
          <input 
            type="email" 
            name="email"
            onChange={formik.handleChange}
            value={formik.values.email}
          />
        </div>
        <button type="submit">注册</button>
      </form>
    </div>
  )
}

可选:如果使用方案B的统一返回结构,调整onSubmit逻辑即可

onSubmit: async (values) => {
  setSuccessMessage('')
  setErrorMessage('')
  const result = await register(values)
  if (result.success) {
    setSuccessMessage(result.data.message)
  } else {
    // 同上的错误处理逻辑
    const err = result.error
    if (err?.status === 422 && err?.data?.errors) {
      const errorList = Object.values(err.data.errors).flat()
      setErrorMessage(errorList.join('、'))
    } else {
      setErrorMessage(err?.data?.message || '注册失败,请稍后重试')
    }
  }
}

注意:如果存在跨域问题,需要在Lumen端配置CORS跨域头,允许你的Next.js域名访问接口。

内容的提问来源于stack exchange,提问作者asela daskon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:39:00