面试题答案
一键面试确保文件安全上传及表单数据准确解析
- 安装依赖:
npm install multer
- 关键代码片段:
const express = require('express'); const multer = require('multer'); const app = express(); // 配置 Multer 存储引擎 const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/');// 文件存储目录 }, filename: function (req, file, cb) { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9); cb(null, file.fieldname + '-' + uniqueSuffix + '.' + file.originalname.split('.').pop());// 生成唯一文件名 } }); const upload = multer({ storage: storage }); app.post('/upload', upload.fields([ { name: 'file1', maxCount: 1 }, { name: 'file2', maxCount: 1 } ]), (req, res) => { // 表单数据在 req.body 中 console.log('表单数据:', req.body); // 文件信息在 req.files 中 console.log('文件信息:', req.files); res.send('上传成功'); }); const port = 3000; app.listen(port, () => { console.log(`服务器在端口 ${port} 上运行`); });
优化性能以应对高并发场景
- 优化思路:
- 负载均衡:使用 Nginx 等工具进行负载均衡,将请求均匀分配到多个 Node.js 实例上,减轻单个实例的压力。
- 文件存储优化:考虑使用分布式文件系统(如 Ceph、MinIO 等),而不是本地磁盘存储,以提高存储的可扩展性和可靠性。
- 缓存:对一些不经常变化的表单数据进行缓存,减少重复解析和处理。例如,可以使用 Redis 作为缓存工具。在每次处理请求前,先检查缓存中是否有对应的数据,如果有则直接使用缓存数据,避免重复解析表单。
- 异步处理:利用 Node.js 的异步特性,将文件上传和表单数据处理的过程异步化,避免阻塞事件循环。例如,使用
async/await
结合文件系统的异步操作(如fs.writeFile
改为fs.promises.writeFile
)来处理文件存储,这样在文件写入磁盘的同时,Node.js 可以继续处理其他请求。 - 流处理:在文件上传过程中,使用流(stream)的方式处理文件,而不是一次性将整个文件读入内存。Multer 本身已经支持流处理,通过
stream
模式,文件可以直接从上传请求流写入到目标存储,减少内存占用。例如,在存储引擎的destination
配置中,可以直接使用流操作将文件写入目标位置,而不是先写入临时文件再移动。