使用multer配合mongoose操作时无法更新MongoDB数据库的问题求助
问题定位与修复方案
核心问题点
- 类型不匹配:你Schema中
profile_img.data定义为String类型,但fs.readFileSync默认返回Buffer类型,Mongoose类型校验不通过导致写入失败,该同步错误没有被你只覆盖了Mongoose异步回调的错误捕获逻辑捕获,所以控制台没有输出。 - 缺少文件存在校验:你的multer配置中不符合格式的文件会被静默拒绝,此时
req.file为undefined,直接访问req.file.filename会抛出未捕获的同步错误。 - 目录缺失风险:multer不会自动创建配置的
uploads存储目录,如果目录不存在会导致文件写入失败,req.file同样为undefined。 - 硬编码配置问题:contentType写死为image/png,和实际上传的文件格式可能不匹配,路径拼接写法也存在跨系统兼容风险。
修复代码
1. 服务启动前自动创建uploads目录
const fs = require('fs') const path = require('path') const uploadDir = path.join(__dirname, 'uploads') // 递归创建目录,避免多级目录不存在的问题 if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }) }
2. 路由逻辑修改
router.post('/profile-chooser/developer/:method',upload.single('profile_photo'),ensureAuthenticated,(req,res) => { // 先校验文件是否上传成功 if (!req.file) { return res.status(400).send('仅支持上传JPG/PNG格式的图片') } // 外层捕获同步操作错误 try { const imgPath = path.resolve(__dirname, '../uploads', req.file.filename) // 将读取到的Buffer转成base64字符串,匹配Schema定义的String类型 const imgBase64 = fs.readFileSync(imgPath).toString('base64') // _id不需要手动转ObjectId,Mongoose会自动处理 User.findOneAndUpdate({ "_id": req.user._id }, { "$set": { "details": { "Some stuff": "update itttt" }, "profile_img": { "data": imgBase64, // 动态取实际上传的文件格式 "contentType": req.file.mimetype } } }) .exec(function(err, user){ if(err) { console.log('数据库操作错误:', err); res.status(500).send(err); } else { res.status(200).send(user); } }); } catch (e) { console.log('文件处理错误:', e) res.status(500).send('文件处理失败') } })
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

