graphql mutation 不支持原生文件上传,需将xml转为字符串或用multipart/form-data;字符串方案轻量但易触发请求体限制,multipart可流式处理;须捕获xml解析等异常并返回精准错误位置。
GraphQL Mutation 不支持原生文件上传
GraphQL 规范本身不定义文件上传机制,mutation 字段不能直接接收二进制数据(如 XML 文件内容)。你看到的“上传 XML 文件”实际是客户端把文件转成某种可序列化的形式,再通过 GraphQL 请求发送过去。常见做法是:把 XML 内容作为字符串传入,或走混合协议(GraphQL + multipart/form-data)。
方案一:XML 内容转为字符串传入 String 字段
最轻量、兼容性最好,适合中小 XML(”、\),否则会破坏 JSON 传输结构。
- 客户端需先读取 XML 文件为文本,用
XMLSerializer(浏览器)或fs.readFileSync(..., 'utf8')(Node.js)获取字符串 - GraphQL mutation 定义字段类型为
String!,例如:mutation UploadXml($content: String!) { uploadXml(content: $content) { id status } } - 服务端 resolver 直接用标准 XML 解析器(如 Node.js 的
libxmljs或fast-xml-parser)处理该字符串 - 注意:若 XML 含有 CDATA 或特殊命名空间,确保解析器配置支持;某些精简 parser(如
xml2js默认不保留空格/注释)可能丢失结构信息
方案二:用 graphql-multipart-request-spec 支持真正的二进制上传
这是目前社区事实标准(被 Apollo、URQL、GraphQL Yoga 等广泛支持),允许在同一个请求中同时发送 GraphQL 操作和文件二进制块。XML 文件以 Upload 标量类型传递,服务端收到的是流或临时文件句柄。