You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Multer和MongoDB时图片路径file.path无法存入用户表问题

核心问题原因

你在内存中修改user.photo属性后,没有调用Mongoose实例的save()方法,改动仅存在于运行时内存,不会自动同步到MongoDB数据库。
同时你当前的逻辑顺序存在冗余问题:先创建Post记录再校验用户是否存在,若用户已存在直接返回,会生成无关联的无效Post数据。

修复方案

方案1(更优):创建用户时直接传入photo参数,无需后续修改

router.post('/register',upload.single('profilepic'), async (req, res) =>{
 const {email}  = req.body

 try{
        // 优先校验用户存在性,避免生成无效垃圾数据
        if (await User.findOne({ email }))
            return res.status(400).send({error: 'User already exists'})

        const userCreateParams = {...req.body}
        if(req.file){
            await Post.create({
                name: req.file.originalname,
                size: req.file.size,
                key: req.file.filename,
                photo: req.file.path,
                url: ''
            })
            // 直接把路径放到创建参数中,创建时直接写入数据库
            userCreateParams.photo = req.file.path
            console.log(req.file)
        }
            
        const user =  await User.create(userCreateParams)
        user.password = undefined
        return res.send({
            user,
            token: generateToken({ id: user.id})
        })

方案2:保留原有写法,修改属性后主动调用保存方法

如果需要保持你当前的代码逻辑,在修改user.photo后新增一行await user.save()即可:

const user =  await User.create(req.body)
user.password = undefined
user.photo = req.file.path
// 新增这行,将改动持久化到数据库
await user.save()
return res.send({
    user,
    token: generateToken({ id: user.id})
})
注意事项

你的用户Schema中title字段设置为必填项,需确保请求的req.body中携带对应title参数,否则会触发用户创建失败的报错。

内容的提问来源于stack exchange,提问作者Paulo Avila

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:24:01