Mongoose:在新创build的对象上设置值后,投射到ObjectId的值失败

尽pipe这已经被多次询问,通常是因为实体没有有效的ObjectId。

我遇到了ObjectId被设置为一个值可以被转移到ObjectId,但仍然得到这个错误的情况。

scheme:

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:000000000000000000000001,_id:55079a90286f49280364f78b} {[CastError:投射到ObjectId在path“serviceName”的值“some Name”失败]

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

使用logging的设置function导致相同的错误:

 serviceFromDB.set('serviceName','000000000000000000000001'); 

这是更新或插入实体的代码,以便稍后设置字段。 解决scheme是在不传递参数的情况下创build服务实例:

 serviceFromDB=new Service(); 

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

解决scheme是在不传递参数的情况下创build服务实例:

 serviceFromDB=new Service();