如何使用 Relay Modern 突变进行文件上传?

Posted

技术标签:

【中文标题】如何使用 Relay Modern 突变进行文件上传?【英文标题】:How to do file uploads with Relay Modern mutations? 【发布时间】:2017-12-30 12:22:28 【问题描述】:

我正在使用react-relay/compat 1.1.0,我需要编写一个能够上传文件的突变。 在 Relay Classic 中,您可以使用 getFiles() 支持突变中的文件上传:

class AddImageMutation extends Relay.Mutation 
   getMutation() 
     return Relay.QL`mutation introduceImage `;
   

   getFiles() 
     return 
       file: this.props.file,
     ;
   
   ...

但在Relay Modern docs 中没有发现任何上传文件功能的痕迹:

const commitMutation = require('react-relay');

commitMutation(
  environment: Environment,
  config: 
    mutation: GraphQLTaggedNode,
    variables: Variables,
    onCompleted?: ?(response: ?Object) => void,
    onError?: ?(error: Error) => void,
    optimisticResponse?: ?() => Object,
    optimisticUpdater?: ?(store: RecordSourceSelectorProxy) => void,
    updater?: ?(store: RecordSourceSelectorProxy) => void,
    configs?: Array<RelayMutationConfig>,

    // files: ... ?
  ,
);

在现代继电器中是否支持?如果是这样,这样做的方法是什么?谢谢。

【问题讨论】:

【参考方案1】:

您必须在commitMutationconfig 对象中将文件作为对象uploadables 提供,然后在您的网络层实现实际上传,因为对服务器的获取请求必须是多部分形式而不是应用程序/json。

有关完整示例,请参阅 https://github.com/facebook/relay/issues/1844#issuecomment-316893590。

【讨论】:

我不知道如何使用useMutation【参考方案2】:

发现这个问题,因为我自己也有同样的问题。

还不确定完整的答案,但我开始阅读 Relay 源代码并根据 packages/relay-runtime/mutations/commitRelayModernMutation.js 看起来您可以将 uploadables 传递给您的突变。

【讨论】:

以上是关于如何使用 Relay Modern 突变进行文件上传?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Relay Modern 命令式突变 API 取消链接记录?

如何在 Relay Modern 中取消订阅

如何进行示例 GraphQL Relay 突变

Relay Modern - 如何在没有 fragmentContainer 的情况下使用 fetchQuery

如何在 Relay Modern 中强制获取

如何在 TypeScript 中使用 Relay Modern(babel-plugin-relay 和 relay-compiler)?