Express使用Multer上传文件时Mongoose报必填校验错误如何修复
报错原因
你触发Mongoose必填校验失败的核心原因是Multer存储配置存在多处拼写、语法错误,导致Multer没有正确执行磁盘存储逻辑,req.file对象上不会生成filename、path属性,传给模型时这两个字段为undefined,自然触发校验报错。
具体错误点:
- 存储配置变量名、传入Multer的配置属性名错写为
storege,正确拼写为storage,Multer读取不到存储配置默认走内存存储,不会生成本地磁盘路径 - destination配置的回调参数错写为
cd,正确回调参数名为cb,会直接触发回调函数未定义错误 - filename生成函数中错误使用
this.path.extname,箭头函数内this不指向当前模块,且你已经全局导入了path模块,不需要加this,这里会直接抛出语法错误导致文件名生成失败 - Multer文件大小限制的配置项错写为
limit(单数),正确配置项为limits(复数),你写的10MB大小限制实际不会生效
修复方案
修正上传路由文件(建议将文件名fails.js改为files.js避免语义错误)的所有配置问题,修复后完整代码如下:
const router = require ('express').Router(); const multer = require('multer'); const path = require('path'); const File = require('../models/file'); const {v4 : uuid4} = require('uuid') let storage = multer.diskStorage({ destination: (req, file, cb) => cb(null, 'uploads/'), filename: (req, file, cb) => { const uniqueName = `${Date.now()}-${Math.round(Math.random()*1E9)}${path.extname(file.originalname)}`; cb(null, uniqueName); } }) let upload = multer({ storage, limits: {fileSize: 10 * 1024 * 1024}, // 10MB标准字节数 }).single('myfiles'); router.post('/' ,(req,res)=>{ upload(req,res,async(error)=>{ if(!req.file){ return res.status(400).json({error: '请选择要上传的文件'}) } if (error){ return res.status(500).send({error: error.message}) } const file = new File({ filename: req.file.filename, uuid: uuid4(), path: req.file.path, size: req.file.size, }); const response = await file.save(); return res.json({file: `${process.env.APP_BASE_URL}/files/${response.uuid}`}); }); }) module.exports = router;
前置检查项
修复代码后请确认以下配置,避免再次出现问题:
- 项目根目录下必须手动创建
uploads文件夹,Multer不会自动创建存储目录,目录不存在会直接导致存储失败 - 前端上传文件时必须设置请求头
Content-Type: multipart/form-data,且文件对应的formData字段名必须和single('myfiles')中配置的myfiles保持一致,否则req.file会为空 - 你提供的Mongoose模型文件没有语法问题,不需要修改
内容的提问来源于stack exchange,提问作者Harshad.N
相关产品推荐
相关产品推荐

