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

FastAPI POST接口单次请求触发四次执行问题排查求助

问题

运行FastAPI服务器时,遇到一个POST接口在单次前端请求下被执行四次的问题。

后端FastAPI代码

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
[...]
@app.post("/create_new_session")
async def create_session(session_id: str, user_id: int = -1):
    create_new_session(session_id, user_id)
    logger.info(
        "created new session", extra={"session_id": session_id, "user_id": user_id}
    )

前端React代码

function APP() {
  [...]
  useEffect(() => {
    const dontUseSessionIdCookie = process.env.REACT_APP_DONT_USE_USER_ID_COOKIE === "true";
    datadogLogs.logger.info(`using session_id cookie: ${!dontUseSessionIdCookie}`, {'session-id': sessionId})
    const foundSessionId = dontUseSessionIdCookie ? undefined : Cookies.get('session_id');
    if (foundSessionId) {
      setSessionId(foundSessionId);
    } else {
      const sessionId = uuidv4();
      datadogLogs.logger.info('New session started', {'session-id': sessionId});  // Logs a new UUID
      Cookies.set('session_id', sessionId, { expires: 7 });
      setSessionId(sessionId);
      fetch(`${api_server_url}/create_new_session?session_id=${sessionId}`, {
        method: 'POST',
        redirect: 'follow',
      })
        .then(response => response.json())
        .then(data => datadogLogs.logger.info('Created new session', { 'data': data, 'session-id': sessionId }))
        .catch((error) => {
          datadogLogs.logger.error('Error while creating a new session:', { 'error': error, 'session-id': sessionId });
        });
    }
  }, [])
}

已排查情况

  • 通过Wireshark捕获HTTP流量,确认前端仅发送了一次请求
  • 后端断点显示每次调用的源端口和session-id相同,调用间隔约800ms
  • 本地环境和Heroku生产环境均出现该问题
  • 前后端日志验证:前端仅生成一条请求日志,后端对应出现四条执行日志
  • 已排查未知重试逻辑,未找到原因
排查思路
  • 检查应用启动实例:确认本地开发是否开启了多个FastAPI进程,或者Heroku的进程配置是否导致多实例运行,重复处理同一请求。
  • 验证中间件影响:临时移除CORSMiddleware或其他自定义中间件,测试是否还会出现重复执行;检查中间件代码是否存在重复调用路由处理函数的逻辑。
  • 排查异步函数问题:后端接口用async定义,但内部create_new_session如果是同步阻塞函数,可能引发事件循环异常导致重复调度。尝试将接口改为同步(去掉async),或确保create_new_session兼容异步执行。
  • 确认日志是否重复记录:检查后端日志配置,是否多次添加了相同的日志处理器,导致同一条日志被多次输出。可以在接口内生成唯一请求ID并写入日志,确认是接口真的执行四次还是日志重复。
  • 检查网关/代理配置:Heroku平台的路由层可能存在重试或健康检查逻辑,在接口中记录X-Forwarded-For、X-Request-ID等头部,确认是否是同一请求被代理重复转发。
  • 验证React副作用执行次数:检查是否开启了React严格模式(开发环境下会重复执行副作用),在useEffect内添加唯一标识的日志,确认是否触发了多次副作用。
  • 检查请求响应处理:确认后端接口是否正确返回响应,是否存在响应超时导致客户端或代理自动重试;虽然Wireshark未捕获到,但可以排查重定向相关逻辑是否异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:35:54