Nuxt 和 Vue Apollo。如何通过重定向到 404/400/500 错误页面来处理 Smart Query 中的错误?我们能捕捉到这样的错误吗?

Posted

技术标签:

【中文标题】Nuxt 和 Vue Apollo。如何通过重定向到 404/400/500 错误页面来处理 Smart Query 中的错误?我们能捕捉到这样的错误吗?【英文标题】:Nuxt and Vue Apollo. How to handle errors inside Smart Query with redirection to 404/400/500 error page? Can we catch such errors? 【发布时间】:2021-05-16 03:55:34 【问题描述】:

对于常规的 HTTP 请求,我们可以使用 asyncData(error)... 来创建重定向

我们应该使用什么来使用 Smart Query 重定向到 400 页面?

用 Vue Apollo,我正在尝试使用

    apollo: 
        queryName: 
            prefetch: true,
            query: wrongQuery,
    
            error(errorData) 
                this.$nuxt.error(
                    statusCode: 500,
                    message: 'Error message',
                );
            ,
        ,
    ;

如果我们重新加载页面,重定向不起作用。由于服务器端渲染,我们仍然遇到错误:

使用全局错误处理程序,例如:

    // /plugins/apollo-error-handler.js
    export default ( graphQLErrors, networkError, operation, forward , nuxtContext) => 
        console.log(networkError)
        nuxtContext.error(
          statusCode: 404,
          message: 'Error message',
        );
    ;

只有错误记录有效。重定向根本不起作用。

我们有没有办法处理智能查询中的错误,例如重定向到 400 页?

我们可以在智能查询中捕捉到这样的错误吗?像 try...catch... 在 asyncData() 中防止应用崩溃。

【问题讨论】:

【参考方案1】:

我找到了解决方案here!

export default function ( redirect ) 
  const link = onError(( graphQLErrors, networkError ) => 
  if (graphQLErrors) 
    graphQLErrors.map(( message ) => 
      if (`$message` === 'Unauthenticated.') 
        redirect('/login')
        // Do Something
        localStorage.setItem('logged', false)
      
    )
  
  if (networkError) 
    console.log(`[Network error]: $networkError`)
  
)
  return 
    defaultHttpLink: false,
    link: ApolloLink.from([link, createHttpLink(
      credentials: 'include',
      uri: 'http://localhost:8000/graphql',
      fetch: (uri, options) => 
        options.headers['X-XSRF-TOKEN'] = Cookies.get('XSRF-TOKEN')
        return fetch(uri, options)
      
    )]),
    cache: new InMemoryCache()
  
`

希望这个答案对您有所帮助! 干杯!

【讨论】:

【参考方案2】:

像这样的智能查询非常有限,所以我更喜欢在我的 Vuex 商店中处理它。不确定这是否是最佳做法,但它现在对我很有用。

async niceFancyVuexAction( dispatch ,  fancyInput ) 
  try 
    const  errors, data  = await this.app.apolloProvider.defaultClient.mutate(
      mutation: yourGraphqlMutationHere,
      errorPolicy: 'all',
      variables: 
        input: fancyInput,
      ,
    )

    if (errors) 
      return dispatch('handleErrors', 'we got some errors')
    

    dispatch('anotherNiceFancyVuexAction', data.Address.createForCompany)
    
    console.log('success !')
   catch (error) 
    // here, you could catch the error and maybe make a redirect
    dispatch('handleErrors', 'the call was not successfull')
  
,

否则,如果您觉得配置它,使用onError 链接也是一个好主意:https://www.apollographql.com/docs/react/data/error-handling/

【讨论】:

感谢您的回答。你如何处理加载状态?通过智能查询,我们可以使用 this.$apollo.loading 来显示微调器。在您的方法中我们应该使用什么? 感谢您的赏金!在这种情况下,我确实将我的 vuex 操作调用到 fetch() nuxt 挂钩中,并使用 $fetchState.pending 助手:nuxtjs.org/docs/2.x/components-glossary/pages-fetch 但也许还有一个 loading 变量可以从 graphql 调用中解构,没有检查这个。

以上是关于Nuxt 和 Vue Apollo。如何通过重定向到 404/400/500 错误页面来处理 Smart Query 中的错误?我们能捕捉到这样的错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nuxt Vue 应用程序中重定向

如何使用 @vue/composition-api 和 nuxt.js 获取 vue-apollo 实例

在 Nuxt JS vuex 中使用 Vue Router 重定向

如何在 Nuxt 的 asyncData 中重定向

Nuxt.js:如何重定向内部方法

如何在Vue中提交表单,重定向到新路由并传递参数?