Fastify 中实现文件上传的最佳实践
Fastify 是一个高效、低开销、易于使用的 Web 框架,特别适合构建高性能的 API。在实际开发中,我们经常需要实现文件上传的功能。本文将介绍如何在 Fastify 中实现文件上传的最佳实践。
- 安装依赖
首先,我们需要安装 fastify-multipart 插件,它使得 Fastify 可以处理 multipart/form-data 格式的请求,也就是文件上传。
npm install fastify-multipart
- 实现文件上传
在 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
数组作为响应体返回给客户端。
- 错误处理
在文件上传过程中,可能会出现各种错误,例如文件太大、文件格式不正确等。为了保证系统的稳定性,我们需要对这些错误进行处理。
下面是一个示例代码,演示了如何在 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 错误响应。
- 总结
本文介绍了在 Fastify 中实现文件上传的最佳实践,包括安装依赖、实现文件上传、错误处理等方面。希望本文对你有所帮助,能够指导你在实际开发中更好地实现文件上传功能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bf144fadd4f0e0ff89cb3b