Node.js 无法使用mongoose模型保存。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

这是一个普通应用程序的一部分。代码执行到达节点控制器方法,并正确创建模型对象(使用控制台日志进行验证)。但是,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: ''
}
错误

如果试图保存生成了错误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
字段的行为。现在我想我知道它是怎么工作的了太好了:)。现在,如果错误已经解决,请接受社区其他人的答案。