如何使用patch API和multer包更新文件/图片并解决ObjectId转换报错
问题修复方案
错误原因
- 传参不符合
findByIdAndUpdate方法要求:该方法第一个参数仅接受用户_id值,你传入了自定义查询对象,Mongoose尝试将对象转换为ObjectId类型失败,触发报错 - multer中间件配置缺失:patch路由未指定接收的文件字段,和post接口的
upload.single("profilePic")配置不一致 - 更新数据格式错误:
{req.body}的写法不符合字段更新要求,同时没有合并上传得到的profile_pic路径
修正后代码
const express = require('express'); const User = require('../models/user.model'); const upload = require('../middlewares/file_upload') const router = express.Router(); router.post('/',upload.single("profilePic"),async (req, res) => { try { const users = await User.create({ first_name:req.body.first_name, last_name:req.body.last_name, profile_pic:req.file.path, }) return res.status(201).send({users}) } catch(e) { return res.status(500).json({message:e.message,status:"Failed"}) } }) // 修复后的patch接口 router.patch('/:id',upload.single("profilePic"),async (req, res) => { try { // 构造更新数据,优先用新上传的文件路径,没有的话保留原有数据 const updateData = {...req.body} if(req.file) { updateData.profile_pic = req.file.path } // 第一个参数直接传用户id,第二个传更新数据 const user = await User.findByIdAndUpdate( req.params.id, updateData, { new:true, runValidators: true } ) if(!user) { return res.status(404).json({message:"用户不存在",status:"Failed"}) } return res.status(200).send({user}) } catch(e) { return res.status(500).json({message:e.message,status:"Failed"}) } }) module.exports = router;
额外优化点
- 增加了用户不存在的404判断,避免返回空数据
- 新增
runValidators: true配置,触发更新时的字段校验,避免脏数据入库 - patch接口响应码改为200,符合RESTful规范(201一般用于资源创建场景)
- 兼容了只更新用户信息不上传头像的场景,如果上传了新头像才覆盖
profile_pic字段
内容的提问来源于stack exchange,提问作者mahboob11
相关产品推荐
相关产品推荐

