- (在对我的原始问题进行了多次编辑之后,我决定将其彻底修改,以使其更加清晰和简洁。这符合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
在服务器端失败时,它会抛出一个错误,然后在客户端重试。这是我所期望的。然而,useFetch
和useAsyncData
不会这样做。相反,错误会写入响应对象,并且不会发出客户端请求。(不过,这不是一个大问题,因为我可以检查响应对象中的错误条目,并在需要时在客户端发出另一个请求。)
- 未决问题:**
- 为什么所有服务器端请求都失败?**我知道Nuxt服务器无法访问浏览器,因此无法访问cookie等。但这些是对本地托管的Laravel API的简单GET请求,不需要身份验证。它们不需要CSRF或会话cookie就能成功。我可以使用Postman成功请求API路由,而不需要cookie。
- 这是因为我做错了什么吗?或者这是开发模式下的预期行为(
pnpm run dev
)?**我在使用Nuxt 2时从未遇到过这个问题。
- 这是因为我做错了什么吗?或者这是开发模式下的预期行为(
恐怕,我忽略了一些明显的东西。
- 谢谢你**
5条答案
按热度按时间rsaldnfx1#
[更新节点]
我得到了和你一样的错误,我的API是不受保护和完全公开的,但也不能得到SSR页面加载数据。
我花了1天的时间来搜索错误,但也许这就是如何解决我的问题,希望它能帮助你:
在此处更新最新的NodeJS LTS版本:https://nodejs.org/en/
我把NodeJS版本从18.12升级到18.13,我的问题完全解决了。
oxiaedzo2#
我也遇到过同样的问题,我确实尝试了一些变通方法,比如设置超时或任意的useFetch()(正如Turukawa在评论中建议的那样),但成功与否仍然各不相同。
我确实发现使用$fetch看起来很稳定,并且可以按预期工作。
编辑:我也试过更新到Node V 18. 13. 0,但它没有修复这个问题。
ogsagwnx3#
电线。
尝试在useFetch请求中将API地址从“localhost”更改为“127.0.0.1“。这可能会对您有所帮助。
yrwegjxp4#
我在nuxtjs v3.1.2(当前版本)中也遇到了同样的问题。这似乎确实是一个时间问题。我通过在nextTick函数中 Package useFetch函数来使它工作:
或者使用脚本设置
kninwzqo5#
确保你的API是可访问的,你可以添加
const { data, error } = useFetch(...)
看看会发生什么。nuxt 3.0.0将仍然与您的应用程序正常工作