javascript Nuxt 3 SSR:useFetch()在页面刷新时返回空值

h9vpoimq  于 2023-02-07  发布在  Java
关注(0)|答案(5)|浏览(2118)
  • (在对我的原始问题进行了多次编辑之后,我决定将其彻底修改,以使其更加清晰和简洁。这符合StackOverflow recommendations。)*
    • 设置:**

创建一个新的Nuxt 3项目:

pnpm dlx nuxi init test-project
cd test-project
pnpm i
pnpm run dev -o

像这样编辑app.vue

<script setup>
const { data: thing } = useFetch("http://localhost:8000/things/1").then(res => {
  console.log(res)
  return res
})
</script>

<template>
  <div>
    <p>{{ thing }}</p>
  </div>
</template>

我添加了console. log语句来跟踪获取发生的位置。
没有更改配置。据我所知,nuxt 3默认为ssr。

    • 问题:**

两种情况:
I.当对app.vue中的代码进行更改并因此触发HMR时,thing将包含来自API的预期数据。
但是,在浏览器中刷新页面时,thing将为空,paragraph-tag将为空。

    • 我的观察:**
  • 相同的行为适用于useAsyncData()。
  • 每次我触发HMR(场景I.),客户机都会向API发出请求并成功接收数据(如开发人员工具的网络选项卡所示)。
  • 每当我在浏览器中刷新页面时(场景II.),我在终端和浏览器控制台中都收到一个控制台日志。两个日志都包含一个错误,状态代码为500,消息为"fetch failed()"。但是,根据网络选项卡,客户端没有发出任何请求。
  • 如果我用$fetch代替,它会在终端记录同样的错误。然而,当请求在服务器端失败时,它会成功地在客户端再次尝试,这样API数据就会显示在页面上。
    • 目前为止我的结论是**

在我看来,所有服务器端请求都失败,而所有客户端请求都成功。
$fetch在服务器端失败时,它会抛出一个错误,然后在客户端重试。这是我所期望的。然而,useFetchuseAsyncData不会这样做。相反,错误会写入响应对象,并且不会发出客户端请求。(不过,这不是一个大问题,因为我可以检查响应对象中的错误条目,并在需要时在客户端发出另一个请求。)

    • 未决问题:**
    • 为什么所有服务器端请求都失败?**我知道Nuxt服务器无法访问浏览器,因此无法访问cookie等。但这些是对本地托管的Laravel API的简单GET请求,不需要身份验证。它们不需要CSRF或会话cookie就能成功。我可以使用Postman成功请求API路由,而不需要cookie。
    • 这是因为我做错了什么吗?或者这是开发模式下的预期行为(pnpm run dev)?**我在使用Nuxt 2时从未遇到过这个问题。

恐怕,我忽略了一些明显的东西。

    • 谢谢你**
rsaldnfx

rsaldnfx1#

[更新节点]

我得到了和你一样的错误,我的API是不受保护和完全公开的,但也不能得到SSR页面加载数据。
我花了1天的时间来搜索错误,但也许这就是如何解决我的问题,希望它能帮助你:
在此处更新最新的NodeJS LTS版本:https://nodejs.org/en/
我把NodeJS版本从18.12升级到18.13,我的问题完全解决了。

oxiaedzo

oxiaedzo2#

我也遇到过同样的问题,我确实尝试了一些变通方法,比如设置超时或任意的useFetch()(正如Turukawa在评论中建议的那样),但成功与否仍然各不相同。
我确实发现使用$fetch看起来很稳定,并且可以按预期工作。
编辑:我也试过更新到Node V 18. 13. 0,但它没有修复这个问题。

ogsagwnx

ogsagwnx3#

电线。
尝试在useFetch请求中将API地址从“localhost”更改为“127.0.0.1“。这可能会对您有所帮助。

yrwegjxp

yrwegjxp4#

我在nuxtjs v3.1.2(当前版本)中也遇到了同样的问题。这似乎确实是一个时间问题。我通过在nextTick函数中 Package useFetch函数来使它工作:

export default {
mounted(): {
   this.$nextTick(async () => {
      const {data, pending, error, refresh } = await useFetch('/...')
   }

}

或者使用脚本设置

<script setup>
import { nextTick } from 'vue'

await nextTick()

const {data, pending, error, refresh } = await useFetch('/...')

</script>
kninwzqo

kninwzqo5#

确保你的API是可访问的,你可以添加const { data, error } = useFetch(...)看看会发生什么。
nuxt 3.0.0将仍然与您的应用程序正常工作

相关问题