我已使用 graphql-upload
(或 apollo-upload-server
)在我的 apollo
GraphQL 服务器上设置了一个突变,以从客户端接收文件,现在我正在尝试为此突变编写测试,但我不确定如何将实际文件附加到我的模拟请求中。
在我的客户端上,我有一个input type="file"
,在上传事件中我提取文件
async upload(event) {
const files = event.target.files || event.dataTransfer.files;
const file = files[0]; // type of file is File
await apollo.mutate({
mutation: gql`
mutation UploadFile($file: Upload) {
uploadFile(file: $file)
}
`,
variables: { file },
})
}
到目前为止一切都很好。但我也想在我的服务器上编写一个测试用例。
这是我的问题
在我的服务器上,我想模仿客户端上传文件。但我找不到如何从 NodeJS 中访问实际文件。
我已经尝试过:
const file = fs.readFileSync('path/to/test-file.csv');
但是 fs
返回一个 Buffer
,而不是 File
类型,它还包含元数据,例如 mimetype
、name
、lastModified
属性。
如何获取实际的File
对象而不是Buffer
?
谢谢!
最佳答案
Node.js 中没有 File
类。在撰写本文时,甚至没有任何其他类可以封装对 MIME 类型、内容和文件名的访问。您将必须使用“较低级别”的方法来完成您想要的任务:
fs.readFileSync
可以从文件描述符或文件路径获取文件的内容。fs.lstatSync
和fs.fstatSync
可以[同步地,就像readFileSync
] 为您提供一些您想要的属性,特别是文件的“上次修改时间戳”。
没有明确接受的方法来获取文件的 MIME 类型 - 尽管某些数据类型的某些 MIME 类型已标准化,但通常会应用内容的启发式分析来确定文件的 MIME 类型。例如,对于也是有效 XML 文件的 SVG 文件(通常为 *.svg
),您需要确保该文件可解析为 XML,以便通过将声明的命名空间 URI 与已知的 SVG 元素命名空间进行比较来确定根“svg”元素属于 SVG 命名空间,然后再积极断言该文件属于 image/svg+xml
MIME 类型。如果想确定的话,这种方法(对实际文件内容的一些分析)将适用于确定 MIME 类型的任何情况。
现在,大多数 Web 服务器仅使用文件扩展名作为 MIME 类型映射的键 - 例如,所有 *.gif
文件都被认为是 image/gif
MIME 类型,即使其中存在垃圾或纯文本。这是因为 Web 服务器和客户端通常都不需要启发式分析 - 如果被假定为 GIF 的文件实际上是垃圾,客户端将中止渲染或渲染垃圾,但确保文件内容有效的责任在于拥有该文件的人,而不是 Web 服务器,而后者并不关心内容,它只提供内容,解析它通常不是它的责任(不适用于“ Assets ”文件)。然而,真正的原因当然是性能——考虑到启发式分析通常比仅根据文件扩展名确定 MIME 类型的成本更高,因此首选后一种方法。
关于node.js - NodeJS : Get File, 不是缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53481650/