Fastify 中实现文件上传的最佳实践

Fastify 中实现文件上传的最佳实践

Fastify 是一个高效、低开销、易于使用的 Web 框架,特别适合构建高性能的 API。在实际开发中,我们经常需要实现文件上传的功能。本文将介绍如何在 Fastify 中实现文件上传的最佳实践。

  1. 安装依赖

首先,我们需要安装 fastify-multipart 插件,它使得 Fastify 可以处理 multipart/form-data 格式的请求,也就是文件上传。

npm install fastify-multipart
  1. 实现文件上传

在 Fastify 中,文件上传需要以下几个步骤:

  • 定义路由
  • 解析请求体
  • 保存文件

下面是一个示例代码,演示了如何实现文件上传:

const fastify = require('fastify')({ logger: true })
const multipart = require('fastify-multipart')
const fs = require('fs')

fastify.register(multipart, { addToBody: true })

fastify.post('/upload', async (req, reply) => {
  const parts = req.parts()
  const files = []

  for await (const part of parts) {
    if (part.file) {
      const fileName = `${Date.now()}-${part.filename}`
      const stream = fs.createWriteStream(`./uploads/${fileName}`)
      await part.pipe(stream)
      files.push(fileName)
    }
  }

  reply.send({ files })
})

fastify.listen(3000, (err) => {
  if (err) {
    fastify.log.error(err)
    process.exit(1)
  }
  fastify.log.info(`server listening on ${fastify.server.address().port}`)
})

首先,我们使用 fastify-multipart 插件注册了 multipart 解析器,并设置了 addToBody 选项为 true,这样我们就可以通过 req.body 访问到上传的文件了。

然后,我们定义了一个 POST /upload 的路由,当客户端发送文件上传请求时,该路由将被触发。在路由处理函数中,我们首先通过 req.parts() 获取请求体的所有部分,然后遍历每一个部分,如果是文件部分,则将文件保存到本地,并将文件名添加到 files 数组中。

最后,我们通过 reply.send() 方法将 files 数组作为响应体返回给客户端。

  1. 错误处理

在文件上传过程中,可能会出现各种错误,例如文件太大、文件格式不正确等。为了保证系统的稳定性,我们需要对这些错误进行处理。

下面是一个示例代码,演示了如何在 Fastify 中处理文件上传错误:

fastify.post('/upload', async (req, reply) => {
  try {
    const parts = req.parts()
    const files = []

    for await (const part of parts) {
      if (part.file) {
        if (part.filename.endsWith('.txt')) {
          const fileName = `${Date.now()}-${part.filename}`
          const stream = fs.createWriteStream(`./uploads/${fileName}`)
          await part.pipe(stream)
          files.push(fileName)
        } else {
          reply.status(400).send({ error: 'Only text files are allowed' })
        }
      }
    }

    reply.send({ files })
  } catch (err) {
    reply.status(500).send({ error: err.message })
  }
})

首先,我们使用 try-catch 语句捕获可能出现的错误。然后,在遍历请求体的每一个部分时,我们检查文件名是否以 .txt 结尾,如果不是,则返回 400 错误响应。最后,如果出现错误,则返回 500 错误响应。

  1. 总结

本文介绍了在 Fastify 中实现文件上传的最佳实践,包括安装依赖、实现文件上传、错误处理等方面。希望本文对你有所帮助,能够指导你在实际开发中更好地实现文件上传功能。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bf144fadd4f0e0ff89cb3b