无法使用 mongoose Model.save() 保存 - 给出内部服务器错误
Posted
技术标签:
【中文标题】无法使用 mongoose Model.save() 保存 - 给出内部服务器错误【英文标题】:unable to save with mongoose Model.save() - gives Internal Server Error 【发布时间】:2021-02-14 06:53:49 【问题描述】:这是 MEAN 应用的一部分。代码执行到达节点控制器方法并正确创建模型对象(使用控制台日志验证)。但是,mongoose model.save() 方法会产生如下所示的错误。可能是什么原因?
节点控制器中的方法
exports.addEmployee = (req, res, next) =>
const employee = new Employee(req.body);
console.log('backend emp ctlr - employee: ' + employee)
employee.save()
.then( addedEmployee =>
res.status(201).
json(
message: 'Employee added.',
employeeId: addedEmployee._id
);
)
.catch(err =>
res.status(500)
.json(
message: "Server Error in saving Employee's data!"
);
);
上面代码中的控制台日志语句给出了正确的模型对象,如下所示
backend emp ctlr - employee:
_id: 5f9e9ee678b4704318ebc927,
title: 'Mr.',
fName: 'Arjun',
lName: 'Singh',
desig: '',
coEmail: 'hemantparmarh@gmail.com',
personalEmail: '',
mobile1: '1111122222',
mobile2: '',
gender: '',
dob: null,
qualifications: '',
band: '',
ctc: null,
dateOfJoining: null,
experienceStartDate: null,
leftCompany: false,
dateOfLeaving: null,
pan: '',
addr1: '',
addr2: '',
city: '',
state: '',
pincode: '',
contactPersonName: '',
contactPersonMobile: '',
userName: ''
错误
【问题讨论】:
在catch
块中执行console.log(err)
并检查错误是什么。
错误是:错误:员工验证失败:_id:转换为 ObjectId 失败,路径为“_id” stringValue:'""',messageFormat:未定义,种类:'ObjectId',值:'',路径:'_id',原因:错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串 --- 我该如何解决这个错误?
根据错误消息,员工对象似乎有一个 _id,其值为空字符串 (_id: ''
)。因此 mongoose 无法将其转换为有效的 ObjectId。请检查req.body
是否有一个_id
字段,其值为空字符串
req.body 没有 _id 因为这是一个正在创建的新文档。但是使用 req.body 在控制器方法的第一行 const employee = new Employee(req.body);
中创建了一个新的猫鼬模型对象。这个对象的 _id 可以在console.log
结果中看到 - 在原始帖子中。
你在req.body
中关于_id=""
是对的毗湿奴。 _id 字段的表单中有一个隐藏的输入字段。当使用相同的表格更新员工记录时,保留此信息以处理该案例。我已将其删除,现在可以保存文档。但我不确定如何分配新的 _id 因为这条线const employee = new Employee(req.body);
【参考方案1】:
如果您尝试保存生成了_id
错误的对象(例如空字符串),则会引发错误。
如果你想自动生成 te _id
你必须不插入到对象中。
例如,像这样的对象:
_id: "",
name: "Name"
尝试保存时会失败。
但同样的对象以这种方式:
name: "Name"
将插入自动生成的_id
。
如果您想在save
之前创建自己的ObjectId
,可以使用mongoose.Types.ObjectId()
,它通过参数接受字符串(字符串应该具有正确的格式)。
如果您的 req.body
对象有一个空字段 _id
这应该可以:
const mongoose = require('mongoose');
req.body._id = mongoose.Types.ObjectId()
之后,你可以save
对象。
【讨论】:
req.body
确实有一个空的_id
,但是当我在控制器方法的第一行创建一个模型对象时,它向_id
字段添加了一个值。然后之后猫鼬 model.save() 方法不起作用。当我从req.body
中删除_id
时,代码起作用了。
控制器第一行添加的值是有效的_id
格式吗?你的猫鼬模式怎么样? _id: mongoose.Types.ObjectId
或不表示 _id
字段应该有效。顺便说一句,如果req.body
始终包含一个空的_id
字段,那么最好不要包含该字段。
猫鼬模式没有_id
字段。我之前不清楚_id
字段的行为。现在我想我知道它是如何工作的了。 :)
很好:)。现在,如果错误已解决,请接受社区其他人的答案。以上是关于无法使用 mongoose Model.save() 保存 - 给出内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章
通过 Model.save() 更新时触发 Mongoose 预保存挂钩