【发布时间】: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);