当前位置: 首页 > news >正文

nextjs+react接口会请求两次?

解决 Next.js + React 接口重复请求问题

在 Next.js 应用中,你可能会遇到 API 请求被发送两次的情况。以下是常见原因和解决方案:

1. 开发模式下 StrictMode 的影响

原因

Next.js 默认启用 React 的 StrictMode,在开发环境下会故意渲染两次组件以帮助发现潜在问题。

解决方案

// next.config.js
module.exports = {reactStrictMode: false, // 关闭严格模式
}

或者仅在生产环境构建时保留:

// next.config.js
module.exports = {reactStrictMode: process.env.NODE_ENV === 'production',
}

2. useEffect 依赖项问题

错误示例

useEffect(() => {fetch('/api/data'); // 会触发多次
});

正确做法

useEffect(() => {const fetchData = async () => {const res = await fetch('/api/data');const data = await res.json();// 处理数据};fetchData();
}, []); // 空依赖数组确保只运行一次

3. 页面渲染和预取导致的重复请求

原因

Next.js 会自动预取页面链接,可能导致 API 被调用多次。

解决方案

// 禁用特定链接的预取
<Link href="/some-page" prefetch={false}>不预取的链接
</Link>

4. 自定义 App 中的重复初始化

错误示例

// _app.js
function MyApp({ Component, pageProps }) {fetch('/api/init'); // 会在每次路由变化时调用return <Component {...pageProps} />;
}

正确做法

// _app.js
function MyApp({ Component, pageProps }) {useEffect(() => {fetch('/api/init');}, []); // 只运行一次return <Component {...pageProps} />;
}

5. API 路由缓存策略

在 API 路由中添加缓存头可以减少重复请求的影响:

// pages/api/data.js
export default function handler(req, res) {res.setHeader('Cache-Control', 's-maxage=10, stale-while-revalidate=59');res.status(200).json({ data: 'your data' });
}

6. 使用请求去重库

安装 axios 并使用请求拦截器:

npm install axios
import axios from 'axios';const api = axios.create();
const pendingRequests = new Map();api.interceptors.request.use(config => {const requestId = `${config.method}-${config.url}`;if (pendingRequests.has(requestId)) {return Promise.reject(new Error('Duplicate request'));}pendingRequests.set(requestId, true);config.requestId = requestId;return config;
});api.interceptors.response.use(response => {const requestId = response.config.requestId;pendingRequests.delete(requestId);return response;
});

7. 检查浏览器插件

某些浏览器插件(如 React Developer Tools、Redux DevTools)可能会导致额外的请求,尝试在无痕模式下测试。

验证解决方案

  1. 检查网络请求是否仍然重复
  2. 确认只在生产环境下保留 StrictMode
  3. 确保所有 useEffect 都有正确的依赖数组

通过这些方法,你应该能够有效减少或消除 Next.js 应用中的重复 API 请求问题。

http://www.lryc.cn/news/595143.html

相关文章:

  • 元宇宙与DAO自治:去中心化治理的数字文明实践
  • 【设计模式C#】简单工厂模式(用于简化获取对象实例化的复杂性)
  • 实时数据可视化的“心跳”设计:毫秒级延迟下的动态图表抗闪烁优化方案
  • 时空数据可视化新范式:基于Three.js的生产全流程时间轴回溯技术解析
  • 基于爬虫技术的电影数据可视化系统 Python+Django+Vue.js
  • 基于VSCode的nRF52840开发环境搭建
  • 机器学习中核心评估指标(准确率、精确率、召回率、F1分数)
  • 动态数据源切换
  • Android Jetpack系列组件之:LiveData(保姆级教程)
  • 动静态库原理与实战详解
  • Ubuntu 22 安装 ZooKeeper 3.9.3 记录
  • 【HarmonyOS】ArkUI - 声明式开发范式
  • 信息整合注意力IIA,通过双方向的轻量级注意力机制强化目标关键特征并抑制噪声,提升特征融合的有效性和空间位置信息的保留能力。
  • I2S音频的时钟
  • C/C++ 详谈结构体大小计算(内存对齐)
  • 移动端轻量级神经网络推理框架
  • 蚂蚁数科AI数据产业基地正式投产,携手苏州推进AI产业落地
  • 解决mac chrome无法打开本地网络中的内网网址的问题
  • ELN和LIMS的区别
  • Django关于ListView通用视图的理解(Cursor解释)
  • Java基础教程(010):面向对象中的this和就近原则
  • 算法训练营DAY37 第九章 动态规划 part05
  • 两个相机的视野 拼接算法
  • 【C++】stack和queue拓展学习
  • DevCon 6记录
  • 从 “能用“ 到 “好用“:中小制造企业数字化转型中的 IT 系统优化管理策略
  • 扬声器测试解决方案
  • AWS Certified Cloud Practitioner 认证考试总结
  • Centos安装最新docker以及ubuntu安装docker
  • 旋转目标检测(Rotated Object Detection)技术概述