如何结合使用apollo-link-http与apollo-upload-client?
解决apollo-link-http与apollo-upload-client配合使用的问题
首先得明确:createUploadLink本身就是增强版的HttpLink,它完全包含了普通HttpLink的所有功能,还额外支持文件上传的处理。所以你不需要同时使用HttpLink和createUploadLink——只需要保留createUploadLink作为终止链接就可以了,把原来的httpLink去掉就行。
修改后的代码示例:
import { ApolloClient, ApolloLink, InMemoryCache } from '@apollo/client'; import { createUploadLink } from 'apollo-upload-client'; // 你的其他中间件链接(authLink、logoutLink、stateLink) const authLink = ...; // 你的认证链接逻辑 const logoutLink = ...; // 你的登出链接逻辑 const stateLink = ...; // 你的状态相关链接逻辑 // 只保留createUploadLink作为终止链接 const uploadLink = createUploadLink({ uri: process.env.REACT_APP_GRAPHQL_URL }); // 组合链接:中间件链接在前,终止链接(uploadLink)在最后 const client = new ApolloClient({ link: ApolloLink.from([ authLink, logoutLink, stateLink, uploadLink // 这里只放uploadLink,不需要httpLink ]), cache: new InMemoryCache() });
为什么不能同时用两个终止链接?
Apollo Link的链路是按顺序执行的,终止链接(terminating link)是整个链路的最后一环,它负责把请求发送到服务器并返回响应。如果你同时放两个终止链接(uploadLink和httpLink),第一个终止链接(uploadLink)就会处理请求返回响应,后面的httpLink根本不会被执行,而且还会导致链路逻辑混乱,这就是你的代码无法正常运行的原因。
而createUploadLink在处理普通GraphQL请求时和普通HttpLink表现完全一致,只有当请求里包含文件上传操作时,它才会自动切换到multipart/form-data的格式发送请求,所以用它完全可以替代HttpLink,同时兼顾普通请求和上传需求。
内容的提问来源于stack exchange,提问作者Jack M.




