使用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
相关产品推荐
相关产品推荐

