Node14环境下apollo-server-express搭配graphql-upload出现Upload未知错误咨询
GraphQL Upload类型报错修复方案
报错根因
当前GraphQL Schema缺少Upload标量的定义与解析映射:
- 你已经禁用了Apollo Server内置的文件上传能力(配置项
uploads: false)、接入了独立的graphql-upload中间件,但没有手动将graphql-upload提供的Upload标量注册到GraphQL Schema中。 - 类型校验环节找不到
Upload类型时,GraphQL会自动从内置标量(Int、Float、String、Boolean)中匹配名称最接近的类型,因此会弹出“Did you mean 'Float'”的联想提示。
具体修复步骤
- 在统一TypeDefs入口补全Upload标量的声明
在你导出全局类型定义的graphql/index.js文件中,手动补充标量的SDL定义:// 引入graphql-upload提供的标量实现 import { GraphQLUpload } from 'graphql-upload'; // 引入你现有的各模块类型定义片段 import imageUploaderType from './modules/Upload/typeDefs.js' // ...其他模块的类型定义 // 把scalar Upload声明加入类型定义集合 export const typeDefs = [ `scalar Upload`, imageUploaderType, // ...其他模块类型 ] - 在全局Resolver中绑定Upload标量的解析逻辑
仅在TypeDefs中声明标量还不够,需要在全局Resolver集合里把Upload类型和graphql-upload的实现做映射:// 你原有的全局Resolver入口 export const resolvers = { // 绑定Upload标量的解析实现 Upload: GraphQLUpload, // ...你现有的Query、Mutation、其他自定义类型的Resolver }
完成上述配置调整后,你现有的文件上传Resolver逻辑无需修改,即可正常读取上传的文件流完成存储。
现有配置校验
你当前已有的配置项无需调整:
uploads: false的配置是正确的:启用独立graphql-upload中间件时,必须关闭Apollo Server内置的上传能力,避免两套文件处理逻辑冲突。graphqlUploadExpress中间件的挂载顺序是正确的:中间件必须在server.applyMiddleware({ app })之前挂载,才能拦截GraphQL请求体中的文件上传流,你当前的代码顺序符合要求。- 当前安装的
graphql-upload@11.0.0版本与Node v14.16.0完全兼容,不需要调整依赖版本。
内容的提问来源于stack exchange,提问作者Manoj Sethi
相关产品推荐
相关产品推荐

