Node.js 无法使用mongoose模型保存。save()-给出内部服务器错误
这是一个普通应用程序的一部分。代码执行到达节点控制器方法,并正确创建模型对象(使用控制台日志进行验证)。但是,mongoose model.save()方法会产生如下所示的错误。原因可能是什么 节点控制器中的方法Node.js 无法使用mongoose模型保存。save()-给出内部服务器错误,node.js,mongoose,mean,Node.js,Mongoose,Mean,这是一个普通应用程序的一部分。代码执行到达节点控制器方法,并正确创建模型对象(使用控制台日志进行验证)。但是,mongoose model.save()方法会产生如下所示的错误。原因可能是什么 节点控制器中的方法 exports.addEmployee = (req, res, next) => { const employee = new Employee(req.body); console.log('backend emp ctlr - employee: ' + emplo
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: ''
}
错误
如果试图保存生成了错误id的对象(例如空字符串),则会抛出错误 如果要自动生成te
\u id
,则必须不插入到对象中
例如,像这样的对象:
{
_id:“”,
姓名:“姓名”
}
尝试保存时将失败
但同样的对象是这样的:
{
姓名:“姓名”
}
将插入自动生成的\u id
如果您想在保存之前创建自己的ObjectId
,可以使用mongoose.Types.ObjectId()
,它通过参数接受字符串(字符串的格式应该正确)
如果您的req.body
对象有一个空字段\u id
这应该可以:
const mongoose=require('mongoose');
req.body.\u id=mongoose.Types.ObjectId()
之后,您可以
保存对象。在catch
块中执行console.log(err)
并检查错误是什么。错误是:错误:员工验证失败:_id:Cast to ObjectId路径处的值“”失败_id“stringValue:”,messageFormat:undefined,kind:'ObjectId',值:“”,路径:“\u id”,原因:错误:传入的参数必须是12字节的单个字符串或24个十六进制字符的字符串---如何解决此错误?根据错误消息,employee对象似乎有一个“id”,其值为空字符串(\u id:”
)。因此mongoose无法将其转换为有效的ObjectId。请检查req.body
是否有值为空字符串的\u id
字段。req.body没有\u id,因为这是正在创建的新文档。但是使用req.body,在控制器方法的第一行中创建了一个新的mongoose模型对象,const employee=new employee(req.body)代码>。这个对象有_id,如原始帖子中的控制台.log
结果中所示。你在请求主体
中关于_id=”“
的回答是对的。在_id字段的表单中有一个隐藏的输入字段。这是为了处理使用同一表单更新员工记录的情况。我已经删除了它,现在可以保存文档了。但是我不确定如何分配新的_id,因为这行const employee=new employee(req.body)
请求主体
确实有一个空的\u id
,但是当我在控制器方法的第一行中创建一个模型对象时,它向\u id
字段添加了一个值。然后,mongoose model.save()方法就不起作用了。当我从req.body
中删除\u id
时,代码工作了。控制器第一行中添加的值是有效的\u id
格式吗?你的猫鼬模式怎么样?\u id:mongoose.Types.ObjectId
或not-indicate\u id
字段应有效。顺便说一下,如果req.body
总是包含一个空的\u id
字段,那么最好不要包含该字段。mongoose模式没有\u id
字段。我之前不清楚\u id
字段的行为。现在我想我知道它是怎么工作的了太好了:)。现在,如果错误已经解决,请接受社区其他人的答案。