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

Nuxt3页面重载时useFetch的error值始终为null问题

问题成因

这是Nuxt v3 RC-3版本中useFetch在客户端首屏初始化阶段的时序bug,两种访问场景下的执行逻辑差异直接导致了现象不一致:

  • 通过nuxt-link客户端跳转进入页面时,组件<script setup>的执行时机是Vue客户端路由完全挂载完成后,此时Nuxt客户端侧的数据请求上下文已经初始化完毕,useFetch返回的error响应式状态可以在请求结束后正常更新,判断逻辑能拿到正确值。
  • 直接刷新页面/地址栏输入访问时,Nuxt会先走客户端水合流程,因为你配置了server: false,服务端不会发起该请求,请求会被放到客户端侧发起。但首屏初始化的同步执行栈运行时,useFetch返回的响应式变量error的更新订阅机制还没完成绑定,你写在await useFetch(...)之后的同步判断逻辑,会在请求状态(包括错误状态)写入响应式ref之前执行,所以此时读到的error.value永远是初始空值。
  • 用setTimeout包裹后问题消失的原因很明确:setTimeout回调属于宏任务,会等当前同步执行栈全部清空、Nuxt客户端水合完成、useFetch的响应式状态绑定全部生效后才执行,此时再读取error.value自然能拿到正确结果。
修复方案

不要依赖setTimeout做兼容——不同设备的水合速度存在差异,固定延时没法保证100%覆盖场景,容易出偶发bug。可以选以下两种稳妥方案:

  1. 保持RC-3版本的前提下,用watch监听error状态变化处理逻辑
const {data: verification, error } = await useFetch(`/proxy/api/does-not-exist`, {
    server: false,
    credentials: "include",
});

watch(error, (errVal) => {
  if (errVal) {
    // 错误处理逻辑放在这里,首屏刷新、客户端跳转场景都能正常触发
  }
}, { immediate: true })
  1. 升级到Nuxt3正式版本,该时序问题在正式版发布前已经完成修复,首屏初始化阶段useFetch的状态更新时序做了对齐,不需要额外处理,直接在顶层await之后同步判断error.value就能拿到正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:15:32