node.js - NodeJS : Get File, 不是缓冲区

标签 node.js graphql fs apollo

我已使用 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 类型,它还包含元数据,例如 mimetypenamelastModified 属性。

如何获取实际的File 对象而不是Buffer

谢谢!

最佳答案

Node.js 中没有 File 类。在撰写本文时,甚至没有任何其他类可以封装对 MIME 类型、内容和文件名的访问。您将必须使用“较低级别”的方法来完成您想要的任务:

  1. fs.readFileSync 可以从文件描述符或文件路径获取文件的内容
  2. fs.lstatSyncfs.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/

相关文章:

javascript - 使用 Node js 和 fs 列出目录、子目录及其文件

javascript - RESTful API 中复杂的 POST 参数的可能格式是什么?

javascript - NodeJS Windows 执行 promise 待定

node.js - Windows Electron 安装程序

graphql - 如何通过 graphql 使用 Passport-local

javascript - 如何在点击时实时更新我的​​组件?

typescript - Prisma with GraphQL - 如何为指定的字符串数组提供显式类型 - 唯一命名问题

Node.js:使用 fs.writeFileSync 写入系统文件

javascript - Node.js 通过 scp 监视传入存档的目录

javascript - 如何让 JavaScript 异常提供更多信息?