遵循 GraphQL 多部分请求规范 detailed here,您可以这样做:
- 创建一个FormData 实例并使用以下内容填充它:
-
operations 字段,
-
map 字段和,
- 要上传的文件
创建 FormData 实例
var formData = new FormData();
operations 字段:
该字段的值将是一个 JSON 字符串,其中包含 GraphQL query 和 variables。您必须将variables 对象中的所有文件字段设置为空,例如:
const query = `
mutation($project: IProject!) {
Project { create(data: $project) { _id } }
}
`;
const project = {
title: document.getElementById("project-title").value,
theme: document.getElementById("project-theme").value,
budget: Number(document.getElementById("project-budget").value),
file: null
};
const operations = JSON.stringify({ query, variables: { project } });
formData.append("operations", operations);
map 字段:
顾名思义,该字段的值将是一个对象的 JSON 字符串,其键是包含文件的 FormData 实例中的字段名称。每个字段的值将是一个数组,其中包含一个字符串,该字符串指示文件对应于值的键将绑定到 variables 对象中的哪个字段,例如:
const map = {
"0": ["variables.project.file"]
};
formData.append("map", JSON.stringify(map));
要上传的文件
然后,您应该按照map 将文件添加到 FormData 实例中。在这种情况下;
const file = document.getElementById("file").files[0];
formData.append("0", file);
就是这样。您现在可以使用 axios 和 FormData 实例向后端发出请求:
axios({
url: "/graphql",
method: "post",
data: formData
})
.then(response => { ... })
.catch(error => { ... });