Node.js Mongoose:设置值后,新创建对象上的值转换为ObjectId失败

Node.js Mongoose:设置值后,新创建对象上的值转换为ObjectId失败,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,尽管这一问题已被多次询问,但通常是因为实体没有字段的有效ObjectId 我遇到了这样一种情况,ObjectId被设置为一个可以转换为ObjectId的值,但仍然会出现这个错误 模式: var serviceSchema = paramMongoose.Schema({ serviceName:{ type: paramMongoose.Schema.Types.ObjectId , ref: 'servicenames',required:true } }); 伪代码

尽管这一问题已被多次询问,但通常是因为实体没有字段的有效ObjectId

我遇到了这样一种情况,ObjectId被设置为一个可以转换为ObjectId的值,但仍然会出现这个错误

模式:

var serviceSchema = paramMongoose.Schema({
  serviceName:{ 
   type: paramMongoose.Schema.Types.ObjectId
   , ref: 'servicenames',required:true 
  }
});
伪代码:

serviceFromDB=new Service({serviceName:'some Name'});
serviceFromDB.serviceName='000000000000000000000001';
serviceFromDB.save(function(paramError,paramData){
  if(paramError){
    console.log('but but but...',serviceFromDB,paramError)
  }
});
此代码的输出为:

但是但是。。。{serviceName:0000000000000000001, _id:55079A90286F4980364F78B}{[CastError:路径“serviceName”处的值“some Name”转换为ObjectId失败]

请注意,serviceName可强制转换为ObjectId,但mongoose使用提供给构造函数的值,而不是之后设置的值

使用相同错误中的结果:

serviceFromDB.set('serviceName','000000000000000000000001');
这是更新或插入实体的代码,以便稍后设置字段。解决方案是在不传递参数的情况下创建服务实例:

serviceFromDB=new Service();
serviceFromDB=new Service();

为此打开了一个实例,因为文档/实体使用构造函数中的值集的行为非常不直观,即使以后重新设置它。

解决方案是在不传递参数的情况下创建服务实例:

serviceFromDB=new Service();
serviceFromDB=new Service();

一个完全不相关的答案标记为重复?我可以用谷歌搜索并使用so搜索,我的朋友也可以,但这个答案与问题的原因无关。很多事情都可能导致此错误,例如查询或尝试使用不可强制转换的值填充。这里的问题描述了一个保存操作,甚至在错误中是object logged有一个有效的对象id,但mongoose试图将一个不再是当前值的值转换为ObjectId。是的,我认为他们在这一点上跳得有点快。审阅者请注意,这与重复的错误相同,但原因和修复方法不同。