无法使用 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 预保存挂钩

.save() 和使用 update() 之间的猫鼬区别

无法使用“model.save()”保存自定义模型

我可以让 model.save() 有一个返回值吗?

Keras model.save() 和 model.save_weights() 的区别?

Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据