当前位置: 首页 > 知识库问答 >
问题:

vue.js - Vue3 SSR onServerPrefetch 调用接口获取数据报错?

臧正平
2024-03-26

大佬们帮忙看一个问题,关于Vue3 SSR onServerPrefetch生命周期的
我是想在该生命周期里调用接口获取数据然后直接在HTML里渲染,结果报错了

<script setup>import { onMounted, onServerPrefetch, ref } from 'vue'import dayjs from 'dayjs'import { getDetail } from '../services/index'const detailData = ref(null)onServerPrefetch(async () => {  let res = await getDetail()  detailData.value = {    ...res.data,    bgsjShow: dayjs(res.data.bgsj).format('YYYY年MM月DD日')  }})onMounted(async () => {  if (!detailData.value) {    let res = await getDetail()    detailData.value = {      ...res.data,      bgsjShow: dayjs(res.data.bgsj).format('YYYY年MM月DD日')    }  }})</script><template>  <section id="page1">    <div class="banner">      <p>名称:{{ detailData.qymc }}</p>      <p>时间:{{ detailData.bgsj }}</p>    </div>  </section></template>

这是报错信息!!!

PS C:\Users\a1561\Desktop\aisino\demo\ssr\basic-vue> yarn serve:ssryarn run v1.22.21$ node server/index.js --ssrfile:///C:/Users/a1561/Desktop/aisino/demo/ssr/basic-vue/server/index.jsC:\Users\a1561\Desktop\aisino\demo\ssr\basic-vue\serverstart server: localhost:5173[Vue warn]: Unhandled error during execution of serverPrefetch hook   at <IndexView onVnodeUnmounted=fn<onVnodeUnmounted> ref=Ref< undefined > >node:internal/process/promises:288            triggerUncaughtException(err, true /* fromPromise */);            ^[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "connect ECONNREFUSED ::1:80".] {  code: 'ERR_UNHANDLED_REJECTION'}Node.js v18.19.1error Command failed with exit code 1.info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

我查看了Vue文档SSR的章节https://cn.vuejs.org/guide/scaling-up/ssr.html#component-life...,并没有找到问题所在,甚至连示例都一致。

共有2个答案

西门品
2024-03-26

提示很明显了,你把这个调用用try catch 包起来,大概率这个接口在服务端请求时报错了

try{    onServerPrefetch(async () => {  let res = await getDetail()  detailData.value = {    ...res.data,    bgsjShow: dayjs(res.data.bgsj).format('YYYY年MM月DD日')  }})}catch(e){    console.log(e);}
锺离浩慨
2024-03-26

根据你提供的错误信息,报错信息中的关键部分是:

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "connect ECONNREFUSED ::1:80".]

这个错误表明,你在onServerPrefetch中调用的getDetail函数返回了一个被拒绝的Promise,而这个Promise没有被正确处理。ECONNREFUSED ::1:80这个错误通常意味着你的应用试图连接到本地主机的80端口,但是连接被拒绝了。这可能是因为你的服务器没有在预期的端口上运行,或者由于防火墙或安全组设置而阻止了连接。

为了解决这个问题,你可以尝试以下几个步骤:

  1. 检查服务器是否正在运行:确保你的服务器正在运行,并且正在监听你试图连接的端口。你可以使用netstat或类似的工具来检查哪些端口正在被使用。
  2. 检查getDetail函数getDetail函数可能返回了一个被拒绝的Promise。你需要确保这个函数正确处理了所有可能的错误情况,包括网络连接失败、服务器无响应等。如果这个函数是从某个库或API调用的,你可能需要查阅该库或API的文档,看看如何处理可能的错误。
  3. 添加错误处理:在onServerPrefetch中调用getDetail时,你应该添加一个.catch块来处理任何可能的错误。这样,即使getDetail返回一个被拒绝的Promise,你的应用也不会崩溃。例如:
onServerPrefetch(async () => {  try {    let res = await getDetail()    detailData.value = {      ...res.data,      bgsjShow: dayjs(res.data.bgsj).format('YYYY年MM月DD日')    }  } catch (error) {    console.error('Failed to fetch data during server prefetch:', error)    // 你可以选择设置一个默认的值给 detailData,或者抛出一个错误,取决于你的应用需求  }})

希望这些建议能帮助你解决问题。如果问题仍然存在,或者你有更多的代码和错误信息可以提供,我会很乐意进一步帮助你。

 类似资料:
  • 基本信息 Path: /api/interface/list Method: GET 接口描述: 请求参数 Headers 参数名称 参数值 是否必须 示例 备注 Content-Type application/json 是 Query 参数名称 是否必须 示例 备注 project_id 是 token 是 page 是 1 当前页数 limit 是 10 每页数量,默认为10,如果不想要分页

  • 基本信息 Path: /api/interface/get Method: GET 接口描述: 请求参数 Headers 参数名称 参数值 是否必须 示例 备注 Content-Type application/json 是 Query 参数名称 是否必须 示例 备注 id 是 接口id token 是 返回数据 名称 类型 是否必须 默认值 备注 其他信息 errcode number 非必须

  • 本文向大家介绍C#微信开发之获取接口调用凭据,包括了C#微信开发之获取接口调用凭据的使用技巧和注意事项,需要的朋友参考一下 获取接口调用凭据 ①接口说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2h(7200s),需定时

  • 功能 ​ 根据站点ID获取站点报告数据 接口 百度商业账号 https://api.baidu.com/json/tongji/v1/ReportService/getData 百度账号 https://openapi.baidu.com/rest/2.0/tongji/report/getData 用户相关性 ​ 用户相关 应用级请求参数 基本参数 参数名 参数类型 是否必需 描述 site

  • 问题内容: 我有一个用户数据库:配置文件,产品,配置以及用户可以拥有的其他内容。我试图找出一种方法来成功链接我的redis调用(一个“ getAll”函数),以便我可以使用所有这些东西返回一个对象,例如: 这是我访问它们的方式/我想做的事情: 收到所需的所有数据后,如何恢复?事件发射器是正确的方法吗? 问题答案: 我认为事件发射器在这里不是一个好选择。您可以跟踪所有呼叫,如下所示: 显然,您将使用

  • 大家好,我是java多线程新手。有人能帮我吗: 我的服务: SpringBoot应用程序: 异步配置: 控制器: 当我点击这个来自邮递员的get请求时,它在响应中显示为空白。我知道我的调用是异步进行的,响应甚至在调用我的方法之前就回来了。有没有办法通过更改邮递员或Spring启动应用程序中的一些设置来查看此响应