Node.js使用multer上传图片后如何将图片存入mongoose的User模型
方案1:调整Schema存储图片路径(推荐)
你当前用multer.diskStorage已经把图片存在本地images目录了,直接存文件路径到数据库比存Buffer体积更小、查询效率更高,首先调整model/user.js的Schema:
const UserSchema = new mongoose.Schema({ name: { type: String, }, profile_pic: { type: String, // 改成存图片访问路径 default: '' } })
然后在controller/user.js的image接口处理逻辑里写如下代码:
const User = require('../model/user') // 引入你的User模型 const fs = require('fs') const path = require('path') exports.image = async (req, res) => { try { // 接口需要前端同时上传用户id参数定位要更新的用户,你也可以用jwt解析当前登录用户的id,根据你的业务逻辑调整即可 const { userId } = req.body if (!userId) return res.status(400).json({ msg: '缺少用户id参数' }) if (!req.file) return res.status(400).json({ msg: '请上传图片文件' }) // 路径可根据你后续静态资源托管的规则调整,比如你托管images目录为静态资源的话,路径可以写成'/images/' + req.file.filename const imagePath = path.join('/images', req.file.filename) // 更新对应用户的头像字段 const updateUser = await User.findByIdAndUpdate( userId, { profile_pic: imagePath }, { new: true } // 配置返回更新后的数据 ) if (!updateUser) return res.status(404).json({ msg: '用户不存在' }) res.status(200).json({ msg: '头像上传成功', user: updateUser }) } catch (err) { // 上传出错的话删除已经存到本地的图片,避免生成垃圾文件 if (req.file) { fs.unlinkSync(req.file.path) } res.status(500).json({ msg: '服务器错误', err: err.message }) } }
后续需要在你的项目入口文件(比如app.js)里配置静态资源托管,才能直接通过路径访问图片:
app.use('/images', express.static('./images'))
方案2:沿用现有Schema存储图片Buffer
如果你一定要把图片存在数据库里,就用下面的逻辑,读取本地存储的图片文件转成Buffer写入数据库即可:
const User = require('../model/user') const fs = require('fs') exports.image = async (req, res) => { try { const { userId } = req.body if (!userId) return res.status(400).json({ msg: '缺少用户id参数' }) if (!req.file) return res.status(400).json({ msg: '请上传图片文件' }) // 读取本地图片文件转成Buffer const imageBuffer = fs.readFileSync(req.file.path) // 更新用户数据 const updateUser = await User.findByIdAndUpdate( userId, { profile_pic: { data: imageBuffer, contentType: req.file.mimetype } }, { new: true } ) if (!updateUser) return res.status(404).json({ msg: '用户不存在' }) // 写入数据库后可以删除本地的图片文件,不需要重复存储 fs.unlinkSync(req.file.path) res.status(200).json({ msg: '头像上传成功', user: updateUser }) } catch (err) { if (req.file) { fs.unlinkSync(req.file.path) } res.status(500).json({ msg: '服务器错误', err: err.message }) } }
Postman测试注意事项
POST请求的form-data里除了image字段传文件之外,还要加userId字段传要更新的用户id即可。
内容的提问来源于stack exchange,提问作者user16437033
相关产品推荐
相关产品推荐

