📅  最后修改于: 2023-12-03 15:06:11.089000             🧑  作者: Mango
在使用 GraphQL 进行数据查询和操作时,我们有时会遇到上传文字不受支持的问题。这可能是因为服务器没有正确配置,也可能是因为我们在请求中使用了不支持的数据类型。
当我们使用 GraphQL 进行文件上传时,通常会将文件作为二进制数据传递。然而,在某些情况下,我们希望上传的是文本类型的数据,如 JSON 或 XML 等。但是,当我们尝试这样做时,可能会遇到以下错误:
{
"errors": [
{
"message": "Upload scalar must be passed a File.",
"locations": [
{
"line": 1,
"column": 26
}
]
}
]
}
这表示服务器无法处理我们上传的文本数据。那么,我们该如何解决这个问题呢?
要解决上传文字不受支持的问题,我们需要采取以下措施:
我们需要确保服务器正确配置以支持文本数据的上传。一些服务器架构(如 AWS Lambda)可能需要我们手动配置 MIME 类型,以允许上传文本数据。请检查服务器文档以获取有关正确配置的更多信息。
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);
如果我们希望上传特定类型的文本数据,如 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 问题可能是由于多种原因引起的。我们可以通过配置服务器、使用正确的数据类型或使用自定义标量类型来解决该问题。在实际应用中,我们需要根据实际情况选择适当的解决方案。