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

如何利用Next.js 14 Server Actions与Axios实现服务端通信及最佳实践

Next.js 14 Server Actions 与 Axios 集成指南

一、实现服务端通信的步骤

1. 安装 Axios

首先在项目中安装 Axios:

npm install axios
# 或者
yarn add axios

2. 创建 Server Action

在 Next.js 14 中,Server Action 只需添加 'use server' 标记即可在服务端运行。直接在 Action 中使用 Axios 发起请求:

// app/actions.ts
'use server';

import axios from 'axios';

// 示例:GET 请求外部 API
export async function fetchExternalData() {
  try {
    const response = await axios.get('https://api.example.com/data');
    return response.data;
  } catch (error) {
    // 区分 Axios 错误与普通错误,返回友好提示
    if (axios.isAxiosError(error)) {
      throw new Error(`请求失败: ${error.response?.data?.message || error.message}`);
    } else {
      throw new Error('未知错误');
    }
  }
}

// 示例:POST 请求提交数据
export async function submitData(payload: { name: string; email: string }) {
  try {
    const response = await axios.post('https://api.example.com/submit', payload, {
      headers: { 'Content-Type': 'application/json' },
    });
    return response.data;
  } catch (error) {
    if (axios.isAxiosError(error)) {
      console.error('请求错误详情:', error.response?.data);
      throw new Error(`提交失败: ${error.response?.statusText || error.message}`);
    }
    throw new Error('提交数据时发生未知错误');
  }
}

3. 在组件中调用 Server Action

无论是客户端组件还是服务端组件,都可以直接调用这些 Action:

// app/page.tsx
'use client'; // 客户端组件需要添加此标记

import { fetchExternalData, submitData } from './actions';

export default function Home() {
  const handleFetch = async () => {
    try {
      const data = await fetchExternalData();
      console.log('获取到的数据:', data);
    } catch (err) {
      console.error('获取数据失败:', err);
    }
  };

  const handleSubmit = async () => {
    try {
      const result = await submitData({ name: 'John Doe', email: 'john@example.com' });
      console.log('提交结果:', result);
    } catch (err) {
      console.error('提交失败:', err);
    }
  };

  return (
    <div className="p-4">
      <button onClick={handleFetch} className="mr-4 p-2 bg-blue-500 text-white">
        获取数据
      </button>
      <button onClick={handleSubmit} className="p-2 bg-green-500 text-white">
        提交数据
      </button>
    </div>
  );
}

二、最佳实践

1. 统一配置 Axios 实例

创建全局 Axios 实例,集中管理 baseURL、超时、拦截器等配置,避免重复代码:

// lib/axios.ts
import axios from 'axios';

const axiosInstance = axios.create({
  baseURL: process.env.EXTERNAL_API_BASE_URL, // 从环境变量读取
  timeout: 10000, // 10秒超时
  headers: { 'Content-Type': 'application/json' },
});

// 请求拦截器:添加认证 Token
axiosInstance.interceptors.request.use(
  (config) => {
    const token = process.env.EXTERNAL_API_TOKEN;
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error)
);

// 响应拦截器:统一处理错误状态码
axiosInstance.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response?.status === 401) {
      throw new Error('认证失败,请检查 Token');
    }
    return Promise.reject(error);
  }
);

export default axiosInstance;

之后在 Server Action 中直接导入这个实例使用即可。

2. 用环境变量管理敏感信息

不要在代码中硬编码 API 密钥、baseURL 等敏感信息,将它们放在 .env.local 文件中:

EXTERNAL_API_BASE_URL=https://api.example.com
EXTERNAL_API_TOKEN=your-secret-token

Next.js 会自动加载这些变量,在 Server Action 中直接通过 process.env 访问。

3. 完善错误处理与日志

在 Server Action 中务必捕获并处理 Axios 错误,记录详细日志(如响应状态码、错误数据)以便调试,同时返回用户友好的错误信息,避免暴露内部细节。

4. 结合 Next.js 缓存优化性能

对于可复用的请求结果,使用 Next.js 的缓存机制减少重复调用外部 API:

'use server';

import axiosInstance from '@/lib/axios';
import { unstable_cache } from 'next/cache';

// 缓存请求结果,1小时后重新验证
export const fetchCachedData = unstable_cache(
  async () => {
    const response = await axiosInstance.get('/data');
    return response.data;
  },
  ['external-data-cache'], // 缓存唯一标识
  { revalidate: 3600 }
);

5. 并发请求优化

如果需要同时发起多个请求,使用 Promise.all 提高效率:

'use server';

import axiosInstance from '@/lib/axios';

export async function fetchMultipleResources() {
  try {
    const [users, products] = await Promise.all([
      axiosInstance.get('/users'),
      axiosInstance.get('/products'),
    ]);
    return { users: users.data, products: products.data };
  } catch (error) {
    throw new Error('获取多资源失败');
  }
}

6. 避免在 Server Action 中混入客户端逻辑

Server Action 运行在服务端,可安全处理敏感操作(如认证、密钥管理),不要将仅客户端的逻辑(如 DOM 操作)放在其中。

内容的提问来源于stack exchange,提问作者Meet Rathod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:22:14