Apollo Link如何将错误包装进响应数据中
解决方案
要实现将错误统一包装进响应数据,让返回结果同时包含data.data和data.error,可以通过修改wrapDataLink并调整链接执行顺序来完成:
1. 完善wrapDataLink逻辑
利用Apollo Link的Observable操作符,捕获成功响应和网络错误,统一包装结构:
import { ApolloLink } from '@apollo/client'; export const wrapDataLink = new ApolloLink((operation, forward) => { return forward(operation) // 处理成功响应,提取数据和GraphQL错误 .map((response) => { const { data, errors } = response; return { data: { data: data, // 可根据需求调整错误格式,比如返回全部错误而非第一个 error: errors ? errors[0] : null } }; }) // 捕获网络错误(如请求超时、连接失败等) .catch((networkError) => { return { data: { data: null, error: networkError } }; }); });
2. 调整链接执行顺序
Apollo Link按数组顺序链式执行,需确保errorLink先处理错误逻辑,再由wrapDataLink统一包装结果:
import { ApolloClient, InMemoryCache, from } from '@apollo/client'; import { RestLink } from 'apollo-link-rest'; // 初始化restLink(根据你的实际配置调整) const restLink = new RestLink({ uri: '你的API地址' }); const client = new ApolloClient({ link: from([ errorLink, // 优先处理错误逻辑(如鉴权错误) wrapDataLink,// 统一包装响应结构 restLink // 最后执行REST请求 ]), cache: new InMemoryCache() });
注意事项
- 若你的
errorLink中针对特定错误(如鉴权错误)做了终止请求的处理,需确保后续流程仍能进入wrapDataLink的包装逻辑; - 错误格式可根据业务需求调整,比如返回所有
graphQLErrors而非仅第一个,或格式化错误信息为更易处理的结构。
内容的提问来源于stack exchange,提问作者Anil Bhaskar
相关产品推荐
相关产品推荐

