📜  上传文字不受支持的 graphql (1)

📅  最后修改于: 2023-12-03 15:06:11.089000             🧑  作者: Mango

上传文字不受支持的 graphql

在使用 GraphQL 进行数据查询和操作时,我们有时会遇到上传文字不受支持的问题。这可能是因为服务器没有正确配置,也可能是因为我们在请求中使用了不支持的数据类型。

问题描述

当我们使用 GraphQL 进行文件上传时,通常会将文件作为二进制数据传递。然而,在某些情况下,我们希望上传的是文本类型的数据,如 JSON 或 XML 等。但是,当我们尝试这样做时,可能会遇到以下错误:

{
  "errors": [
    {
      "message": "Upload scalar must be passed a File.",
      "locations": [
        {
          "line": 1,
          "column": 26
        }
      ]
    }
  ]
}

这表示服务器无法处理我们上传的文本数据。那么,我们该如何解决这个问题呢?

解决方案

要解决上传文字不受支持的问题,我们需要采取以下措施:

  1. 配置服务器

我们需要确保服务器正确配置以支持文本数据的上传。一些服务器架构(如 AWS Lambda)可能需要我们手动配置 MIME 类型,以允许上传文本数据。请检查服务器文档以获取有关正确配置的更多信息。

  1. 使用正确的数据类型

GraphQL 支持各种标量数据类型,如 String、Int、Float 和 Boolean 等。如果我们在请求中使用不支持的数据类型,服务器将无法正确处理上传。因此,我们需要确保我们使用的数据类型是正确的。如果我们希望上传 JSON 数据,我们可以使用 String 类型,然后在服务器端将其解析为 JSON。

例如,假设我们要上传以下 JSON 数据:

{
  "name": "John",
  "age": 30
}

我们可以将其作为字符串传递:

mutation {
  createUser(data: "{ \"name\": \"John\", \"age\": 30 }") {
    id
    name
    age
  }
}

然后,我们可以在服务器端将其解析为 JSON:

const data = JSON.parse(request.body.data);
  1. 使用自定义标量类型

如果我们希望上传特定类型的文本数据,如 XML 或 CSV,我们可以使用自定义标量类型。我们可以通过以下方式定义一个名为 Upload 的自定义标量类型:

scalar Upload

在定义中,我们可以指定该类型的实现方式。例如,我们可以使用 Node.js 的 fs 模块读取上传的文件:

const { GraphQLScalarType } = require('graphql');
const { createReadStream } = require('fs');

const UploadType = new GraphQLScalarType({
  name: 'Upload',
  parseValue(value) {
    return createReadStream(value.path)
  }
});

然后,我们可以在查询或操作中使用该类型:

mutation {
  uploadFile(file: "path/to/file.csv") {
    success
  }
}

当我们在服务器端处理该请求时,解析器将自动将上传的文件路径转换为可读流。

结论

上传文字不受支持的 GraphQL 问题可能是由于多种原因引起的。我们可以通过配置服务器、使用正确的数据类型或使用自定义标量类型来解决该问题。在实际应用中,我们需要根据实际情况选择适当的解决方案。