通过ID更新MongoDB对象报错:userId.save is not a function
解决
userId.save is not a function错误及MongoDB对象更新方法 问题原因
findById是异步操作,直接赋值得到的是Promise而非Mongoose文档Users.findById()返回的是Promise对象,不是具备save()方法的Mongoose Document实例,所以调用userId.save()会报错。必须等待异步操作完成,拿到真实的用户文档后再操作。Object.assign参数错误
你传入了JSON字符串作为第二个参数,Object.assign需要的是普通JavaScript对象,而非字符串,否则无法正确合并更新属性。
解决方案1:异步处理查询+修改保存
使用async/await处理异步查询,确保拿到文档实例后再修改保存:
const Users = require('pathToSchema') async function updateUser() { try { // 等待异步查询完成,获取用户文档 const user = await Users.findById('你的用户ObjectId') if (!user) { console.log('未找到指定用户') return } // 传入对象合并更新属性 Object.assign(user, { email: "test@gmail.com" }) // 保存更新后的文档 const updatedUser = await user.save() console.log(updatedUser) } catch (err) { console.error('更新失败:', err) } } updateUser()
解决方案2:直接使用findByIdAndUpdate(更高效)
如果不需要先获取文档再修改,推荐直接用Mongoose提供的findByIdAndUpdate方法,一步完成更新:
const Users = require('pathToSchema') Users.findByIdAndUpdate( '你的用户ObjectId', // 目标用户ID { email: "test@gmail.com" }, // 要更新的字段 { new: true, // 返回更新后的文档(默认返回更新前) runValidators: true // 触发Schema的字段校验规则 } ) .then(updatedUser => { if (!updatedUser) { console.log('未找到指定用户') return } console.log(updatedUser) }) .catch(err => console.error('更新失败:', err))
补充说明
runValidators: true很重要:默认更新操作不会触发Schema中定义的校验规则(比如required: true),开启后会确保更新的字段符合Schema要求。- 若需要更新多个字段,直接在第二个参数中添加更多键值对即可,比如
{ email: "test@gmail.com", name: "新名称" }。
内容的提问来源于stack exchange,提问作者seriously
相关产品推荐
相关产品推荐

