【问题标题】:Error 500 (RuntimeError) when refetching data with axios and nuxtjs使用 axios 和 nuxtjs 重新获取数据时出现错误 500 (RuntimeError)
【发布时间】:2021-11-05 00:49:02
【问题描述】:

我构建了一个基于博客的页面,其中 wordpress 作为 api,nuxtjs 作为 javascript 框架。 问题发生在我的 _slug.vue 中。当我导航到单个博客(项目)帖子时,单个帖子会正常呈现。但是,如果我重新加载单个帖子页面,或者当我只输入 url 时,我会在控制台中收到错误:GET url 500 (RuntimeError)。

<template> 
<div class="single-project">
    <Header />
    <h1>{{project.title.rendered}}</h1>
    <article v-html="project.content.rendered"></article>
    <ClickToAction />
</div>
<script>
/* eslint-disable */
import axios from 'axios'
export default{
    data() {
        return {
            project: {}
        }
    },
    async asyncData({params}){

            return await axios.get('https://my-api.wp/wp-json/wp/v2/project/' + params.id)
                .then((res) => {
                    return {
                        project: res.data
                    }
                }).catch(function (error) {
                    if (error.response) {
                    // Request made and server responded
                    console.log(error.response.data);
                    console.log(error.response.status);
                    console.log(error.response.headers);
                    } else if (error.request) {
                    // The request was made but no response was received
                    console.log(error.request);
                    } else {
                    // Something happened in setting up the request that triggered an Error
                    console.log('Error', error.message);
                    }
                });
    }
}
</script>

以及一个项目的链接:

<nuxt-link :class="'item ' + project._embedded['wp:term'][0].map(el => el.name.toLowerCase()).join(' ')" v-for="project in projects"  :key="project.id" :to="{name: 'projekte-slug', params: { slug: project.slug, id: project.id}}">

目标在 nuxt.config.js 中是静态的

编辑

经过研究发现,在 nuxt-link 参数对象中传递的 id 在重新加载后会丢失,因为它需要“父”页面来获取 id 的值。为了解决这个问题,我使用 slug 获取项目,该项目始终包含在 api 的 url project/:slug 中,并显示了所有属性(例如标题、内容......)

async asyncData({ params, $axios }) {
        try {
            console.log(params.slug);
            const project = await $axios.$get(`https://my-api.wp/wp-json/wp/v2/project?slug=${params.slug}&_embed`)
            return { project }
        } catch (error) {
...
}

【问题讨论】:

    标签: wordpress vue.js axios nuxt.js headless


    【解决方案1】:

    asyncData 不会在您刷新页面或直接键入 URL 时重新触发。
    如果您想获取这些事件的数据,请使用fetch() hookmiddleware


    编辑答案

    在继续操作之前,请确保您已安装 @nuxtjs/axioshttps://axios.nuxtjs.org/setup

    <script>
    export default {
      async asyncData({ params, $axios }) {
        try {
          const project = await $axios.$get(`https://my-api.wp/wp-json/wp/v2/project/${params.id}`)
          return { project }
        } catch (error) {
          if (error.response) {
            // Request made and server responded
            console.log(error.response.data)
            console.log(error.response.status)
            console.log(error.response.headers)
          } else if (error.request) {
            // The request was made but no response was received
            console.log(error.request)
          } else {
            // Something happened in setting up the request that triggered an Error
            console.log('Error', error.message)
          }
        }
      },
    }
    </script>
    

    【讨论】:

    • 你有这方面的参考吗?我在任何地方都在使用asyncData,并且在页面重新加载方面没有任何问题
    • @tho-masn 参考在文档中:Unlike fetch, the promise returned by the asyncData hook is resolved during route transition. 您可以简单地使用console.log 来查看它是否被触发。不确定您的应用程序作为一个整体是如何工作的,但这就是它到目前为止的工作方式。 nuxtjs.org/docs/2.x/features/data-fetching#async-data
    • 是的,但这意味着,asyncData 允许阻塞渲染,只要返回的 Promise 没有被解析。 fetch 不允许您这样做,但是您有待处理的状态,而 asyncData 没有这些状态。但是,这并不意味着asyncData 不会在页面加载时执行。
    • @tho-masn 该死的,你是对的.. 一直以为它不是在硬刷新时触发的。嗯......我可能失败了,该死的我的坏!所以,我编辑了我的答案,试试这个语法,看看它是否效果更好。
    • @kissu 感谢您的回答,但在本地主机上重新加载页面后仍然出现相同的错误。当我部署站点时,我收到另一个错误(404):GET my-api.wp/wp-json/wp/v2/project/undefined 404。似乎重新加载时 id 未定义......你们对此有任何想法吗?
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多