You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ApolloGraphQL与ReScript实现文件上传:apollo-upload-client集成方案求助

集成apollo-upload-client到ReScript + Apollo GraphQL项目

我之前在ReScript + Apollo GraphQL的项目里实现过文件上传功能,刚好能给你一些具体的解决方案!下面是一步步的操作指南:

1. 安装依赖

首先确保你已经安装了apollo-upload-client:

npm install apollo-upload-client
# 或者用yarn
yarn add apollo-upload-client

因为ReScript的Apollo Client绑定没有内置createUploadLink,我们需要通过@module装饰器来绑定这个JS函数:

@module("apollo-upload-client")
external createUploadLink: (
  ~uri: string => string,
  ~headers: Js.Dict.t<string>=?,
  unit,
) => ApolloClient.Link.t = "createUploadLink"

这个绑定会让我们在ReScript代码里像调用原生函数一样使用createUploadLink,并且类型和Apollo的Link完全兼容。

把你原来的httpLink替换成用createUploadLink创建的链接,它会自动处理文件上传所需的multipart/form-data请求头:

// 替换原来的httpLink定义
let uploadLink = createUploadLink(~uri=_ => Env.graphqlEndpoint, ())

// 保持其他client配置不变,只把link里的httpLink换成uploadLink
let client = {
  open ApolloClient
  make(
    ~cache=Cache.InMemoryCache.make(),
    ~connectToDevTools=true,
    ~defaultOptions=DefaultOptions.make(
      ~mutate=DefaultMutateOptions.make(~awaitRefetchQueries=true, ~errorPolicy=All, ()),
      ~query=DefaultQueryOptions.make(~fetchPolicy=NetworkOnly, ~errorPolicy=All, ()),
      ~watchQuery=DefaultWatchQueryOptions.make(~fetchPolicy=NetworkOnly, ~errorPolicy=All, ()),
      (),
    ),
    ~link=ApolloClient.Link.from([authTokenContextLink, uploadLink]),
    (),
  )
}

4. 编写文件上传的Mutation

接下来你需要定义支持文件上传的GraphQL Mutation,注意变量类型要使用Upload:

module UploadFileMutation = %graphql(`
  mutation UploadFile($file: Upload!) {
    uploadFile(file: $file) {
      id
      url
    }
  }
`)

5. 调用Mutation上传文件

当你需要上传文件时,从文件输入框获取File对象,然后传入Mutation变量:

// 假设你有一个文件输入的ref
let fileInputRef = React.useRef(Js.Nullable.null)

let handleUpload = () => {
  switch fileInputRef.current->Js.Nullable.toOption {
  | Some(input) =>
    switch input.files->Js.Nullable.toOption {
    | Some(files) =>
      let file = files->Js.Array.get(0)
      UploadFileMutation.useMutation()->ApolloClient.Mutation.mutate(~variables={ "file": file }, ())
    | None => ()
    }
  | None => ()
  }
}

关键注意点

  • createUploadLink会自动检测请求中是否包含文件,动态切换Content-Type为multipart/form-data,不需要手动设置
  • 确保你的Apollo Server端也配置了文件上传支持(比如安装graphql-upload并启用对应的中间件),否则客户端上传会失败

内容的提问来源于stack exchange,提问作者Ihar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:39:08