You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何结合使用apollo-link-http与apollo-upload-client?

首先得明确:createUploadLink本身就是增强版的HttpLink,它完全包含了普通HttpLink的所有功能,还额外支持文件上传的处理。所以你不需要同时使用HttpLinkcreateUploadLink——只需要保留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.

火山引擎 最新活动