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

Next.js 13.5+ Vercel部署后Axios获取数据不更新问题求助

基于Axios解决Next.js 13.5+部署Vercel后无法获取最新数据的方案
  • 给请求添加禁用缓存的头
    Vercel和Next.js默认会对GET请求做静态缓存,给Axios请求带上禁用缓存的响应头,强制每次拉取最新数据:

    const [data, setData] = useState<any>();
    useEffect(() => {
      axios.get("/api/admin/getAllCategories", {
        headers: {
          'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',
          'Pragma': 'no-cache',
          'Expires': '0'
        }
      }).then((res) => setData(res.data));
    }, []);
    

    这些头会告知服务器和浏览器不要缓存该请求结果,确保每次请求都直达后端获取最新数据。

  • 拼接缓存破击参数
    在请求URL后面加上随机参数(比如时间戳),让每次请求的URL唯一,绕过缓存机制:

    const [data, setData] = useState<any>();
    useEffect(() => {
      axios.get(`/api/admin/getAllCategories?timestamp=${Date.now()}`)
        .then((res) => setData(res.data));
    }, []);
    

    也可以用项目版本号、哈希值替代时间戳,只要保证数据更新或部署后参数能变化即可。

  • 全局配置Axios实例
    项目中多处使用Axios的话,直接全局配置禁用缓存,避免重复写头信息:

    // 比如在utils/axios.ts中创建全局实例
    import axios from 'axios';
    
    const axiosInstance = axios.create({
      baseURL: '/api',
      headers: {
        'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',
        'Pragma': 'no-cache',
        'Expires': '0'
      }
    });
    
    export default axiosInstance;
    

    之后项目里所有请求都用这个实例,自动带上禁用缓存的头。

  • 在API路由端设置缓存策略
    如果是自定义的Next.js API路由,直接在后端响应里设置缓存头,从源头杜绝缓存:

    // App Router 示例(app/api/admin/getAllCategories/route.ts)
    export async function GET() {
      const categories = await fetchCategoriesFromDB(); // 你的数据获取逻辑
      return new Response(JSON.stringify(categories), {
        headers: {
          'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',
          'Pragma': 'no-cache',
          'Expires': '0'
        }
      });
    }
    
    // Pages Router 示例(pages/api/admin/getAllCategories.ts)
    export default async function handler(req, res) {
      const categories = await fetchCategoriesFromDB();
      res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');
      res.setHeader('Pragma', 'no-cache');
      res.setHeader('Expires', '0');
      res.status(200).json(categories);
    }
    
  • 手动触发重新请求
    如果需要在数据更新后(比如新增/修改分类)获取最新数据,把请求逻辑抽成独立函数,在需要时调用:

    const [data, setData] = useState<any>();
    
    const fetchCategories = async () => {
      const res = await axios.get("/api/admin/getAllCategories", {
        headers: { 'Cache-Control': 'no-store' }
      });
      setData(res.data);
    };
    
    useEffect(() => {
      fetchCategories();
    }, []);
    
    // 比如提交表单后重新拉取数据
    const handleSubmit = async (formData) => {
      await axios.post("/api/admin/addCategory", formData);
      fetchCategories();
    };
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:42:29