前端只发起了一次请求为什么后端会收到两次?

最近项目中一直会出现一个比较奇怪的现象:偶尔有用户会重复触发某个接口,但是埋点记录能确定在前端的代码里只发起了一次,前端也没重试的机制。从用户的UA以及环境找不到共同点,在网上搜了下说有可能是nginx的重试机制

https://www.cnblogs.com/caibaotimes/p/15407971.html

我们的项目都是走公司统一的结构、构建以及发布(react)所以我想问下
1、怎么确定该项目是否走了nginx代理?
2、如果上面的原因真是nginx重试导致的,怎么排查?

感谢~

阅读 830
3 个回答

有可能是浏览器的重试机制,也有可能是nginx的重试机制。

排查就是就是每一层加个唯一id。

比如说前端发起的时候加个 uuid: Math.random(),这样就可以判断是谁发起了多次。

当然也得关注是不是触发了 option 预检请求,出现在跨域时


如果上述你都已经查完了,接下来就是看日志了。比如说 nginx 的 access_log 加上 grep 过滤去找。

也可以试着修改 Nginx 的重试机制。在 Nginx 配置中找到相关的配置项,可能是 proxy_next_upstream 或 proxy_retry 相关的配置。


或许这个是你想要的?
https://stackoverflow.com/questions/15155014/inconsistent-browser-retry-behaviour-for-timed-out-post-requests

更多相关的内容:https://stackoverflow.com/search?q=chrome+request+retry&s=f8018be9-1a56-4af7-9f42-7125dbc6744e&s=db4e609e-9b53-40d0-a2da-18edeb0d50cb

简单分析下

  1. 这篇博客说的场景是集群部署,说的是因为 nginx 的重试机制导致一个请求打在了两台服务器上。
  2. 单机部署不可能出现因为重试机制产生两个有效请求,因为重试最终成功的,那服务端的日志也应该是最后一次成功,前面的都是失败
  3. 代码里确定只调了一次,浏览器控制台的 network 中确认过没,是不是确实只有一次?
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏