【问题标题】:AsyncData with multiple requests in NuxtNuxt 中具有多个请求的 AsyncData
【发布时间】:2021-11-06 23:02:20
【问题描述】:

我正在尝试从两个 API 路由中获取答案,并根据结果显示数据。但是由于某种原因,当我尝试使用超过 1 个 axios 调用时它不起作用,并出现 404/500 错误。

我尝试了以下方法:

<template>
  <div v-if="blogPost">
    <p>post</p>
  </div>
  <div v-else-if="blogCategoryPosts">
    <p>category,posts</p>
  </div>
</template>

<script>
export default {
  async asyncData({ $axios, app, route }) {
    const blogPost = await $axios.get(`${process.env.API_DOMAIN}/api/blog/posts${route.path}`)

    const blogCategoryPosts = await $axios.get(`${process.env.API_DOMAIN}/api/blog/categories${route.path}`)

    return {
      blogPost: blogPost.data,
      blogCategoryPosts: blogCategoryPosts.data,
    }
  },
}
</script>

<script>
export default {
  async asyncData({ $axios, app, route}) {
    const [blogPost, blogCategoryPosts] = await Promise.all([
        $axios.get(`${process.env.API_DOMAIN}/api/blog/posts${route.path}`),
        $axios.get(`${process.env.API_DOMAIN}/api/blog/categories${route.path}`),
    ])

    return {
        blogPost: blogPost.data,
        blogCategoryPosts: blogCategoryPosts.data,
    }
  },
}
</script>

每个调用单独工作都很好,但它们不能一起工作。知道这是为什么吗?

【问题讨论】:

    标签: vue.js nuxt.js


    【解决方案1】:

    你应该像这样await你的Promise.all

    const [blogPost, blogCategoryPosts] = await Promise.all([
      $axios.get(`${process.env.API_DOMAIN}/api/blog/posts${route.path}`),
      $axios.get(`${process.env.API_DOMAIN}/api/blog/categories${route.path}`),
    ])
    

    另外,不要忘记第一个 $axios 末尾的 ,


    我前段时间给过类似的answer here


    PS:如果您想快速解决这些问题,请使用 ESlint。
    如果你想了解如何同时拥有 ESlint 和 Prettier 的教程,可以关注我的tutorial here

    【讨论】:

    • 谢谢。我忘记在下面的示例中添加“等待”(但它在我的旧代码中),我的代码无论如何都不起作用。
    • my code don't work anyway 请在这里更明确一点,它会给你一个错误。此外,您可能确实忘记了上面提到的,
    • 是的,这里有逗号。它返回通用“请求失败,状态码为 500”,我将尽快启用 ESlint。
    • @RedEclipse 好的,所以这是服务器问题。检查网络选项卡中是否有更多详细信息(在您的浏览器开发工具中),然后瞄准您的后端检查日志。如果其他一切都到位,可能不是 Nuxt 问题。
    • 这是我的想法,但 API 工作正常,虽然直接访问或单独使用每个 axios 调用。
    【解决方案2】:

    所以在我的情况下,为 axios 指出 .then.catch 就足够了

      export default {
      async asyncData({ $axios, app, route}) {
        
        const blogPost = await $axios.get(`${process.env.API_DOMAIN}/api/blog/posts${route.path}`).then(response => response.data).catch(error => {})
    
        const blogCategoryPosts = await $axios.get(`${process.env.API_DOMAIN}/api/blog/categories${route.path}`).then(response => response.data).catch(error => {})
    
        return {
          blogPost: blogPost,
          blogCategoryPosts: blogCategoryPosts,
        }
      },
      }
    

    一切运行良好。另外我有点误解了 500 错误,我认为这是一条通用消息,但我的 API 只是告诉我找不到该类别。

    【讨论】:

    • 这将是顺序的。
    • 时间证明它是不完美的。我有一个适用于 axios 的拦截器应用程序范围(它捕获 500 错误),因此例如,如果类别存在(并且不存在,显示 500 错误),它工作得很好,但是当我在类别内获得一个帖子时,它显示帖子但由于找不到类别而引发 500 错误(弹出),我该如何防止呢?
    • 你有这方面的公开回购吗?
    • 还没有,我意识到我的方法并不好。我只想将我所有的祝酒词保存在一个单独的 axios.js 文件中(这里有 500 和其他错误的拦截器),但是当我在一页上获取 2 个 axios 实例时,它总是会删除错误。所以我稍微改变了后端,当它找不到从 500 到 404 的类别时,现在的东西至少可以正常工作:)
    猜你喜欢
    • 2019-06-04
    • 2022-11-11
    • 2019-05-03
    • 2021-04-01
    • 2021-07-18
    • 1970-01-01
    • 2018-06-08
    • 2012-12-08
    • 2021-06-21
    相关资源
    最近更新 更多