我已经在apollo
GraphQL服务器上使用graphql-upload
(或apollo-upload-server
)设置了一个变种,以从客户端接收文件,现在我我正在尝试为此突变编写测试,但我不确定如何将实际文件附加到模拟请求中。
在我的客户端上,我有一个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
,{{1} }属性。
如何获取实际的lastModified
对象而不是File
?
谢谢!
答案 0 :(得分:2)
Node.js中没有File
类。而且,在假设存在该平台的类的对象中,没有任何东西可以组合MIME类型,文件内容和文件名。您将必须使用不同的方法来获取所需的所有信息。
fs.readFileSync
可以从文件描述符或文件路径获取文件的内容。fs.lstatSync
和fs.fstatSync
[与readFileSync
一样[同步地]为您提供了一些您想要的属性,尤其是文件的“最后修改的时间戳”。 没有绝对可接受的方法来获取文件的MIME类型-尽管某些类型的数据的某些MIME类型已标准化,但通常会对内容进行启发式分析以确定文件的MIME类型。例如,对于同样也是有效XML文件的SVG文件(通常为*.svg
),您需要确保该文件可解析为XML,从而确定根“ svg”元素属于通过将声明的名称空间URI与已知的SVG元素名称空间进行比较,将其添加到SVG名称空间,然后可以断言该文件为image/svg+xml
MIME类型。这种方法-对实际文件内容进行一些分析-如果需要确定的话,将适用于任何确定MIME类型的情况。
现在,大多数Web服务器仅将文件的扩展名用作MIME类型映射的键-例如,据说所有*.gif
文件都是image/gif
MIME类型,即使存在垃圾或纯文字。这是因为Web服务器和客户端通常都不需要进行启发式分析-如果假定是GIF的文件实际上是垃圾,则客户端将中止渲染或渲染垃圾,但是确保文件内容有效的责任在于拥有文件的人,而不是拥有Web服务器的人,并且Web服务器无论如何都不关心内容,它仅提供服务的内容,解析它通常不是真正的责任(不是“资产”文件)。但是,真正的原因当然是性能-鉴于启发式分析通常比仅基于文件扩展名确定MIME类型更为昂贵,因此后者是首选。
答案 1 :(得分:0)
简单:
const file = fs.readFileSync('path/to/test-files.csv').toString();
希望它会有所帮助:-)
答案 2 :(得分:0)
您可以将编码设置为utf-8。
fs.readFile(path.resolve(path), { encoding: 'utf-8', flag: 'r' }, (error, data) => {
})