使用 Mongoose.js 保存模型时,为啥会出现“无法调用未定义的 doValidate”?

Posted

技术标签:

【中文标题】使用 Mongoose.js 保存模型时,为啥会出现“无法调用未定义的 doValidate”?【英文标题】:Why do I get "cannot call doValidate of undefined" when saving a model using Mongoose.js?使用 Mongoose.js 保存模型时,为什么会出现“无法调用未定义的 doValidate”? 【发布时间】:2011-08-06 20:14:21 【问题描述】:

请有人帮忙解释一下我在使用 mongoose.js ORM 时做错了什么,并就如何解决问题给我一些指导。

问题

当尝试使用 mongoose.js orm 保存模型时,我收到一个错误:

无法调用未定义的方法“doValidate”

架构定义

我正在尝试使用此架构保存对象:

var myEntity = new Schema(
  objectId            : ObjectId
  ,title             : String
  , decription        : String
  , ownerId           : String
  , start               : 
     something : 
      // ...
     
   //removed for brevity!
  
  , end             : 
     something : 
      // ...
     
   //removed for brevity!
    
  , useruid           : String
  , _created          :  type : Date, "default": new Date()
  , _updated          :  type : Date, "default": new Date()

mongoose.model("MyEntity", MyEntity);

定义模型

我已将模型放在一个容器中,以便我可以通过以下方式访问它们:

var xyz = new models['whatever']();

容器对象如下:

var models = 
  MyEntity : mongoose.model("MyEntity"),
;

创建模型

我创建模型,传入一个带有所有正确“映射”或属性的 JSON 对象:

var newEntity = new models.MyEntity(someObj);

保存模型

那么下面的代码就是我保存模型的方法:

newEntity.save(function(error) 

                  if (error) 
                    console.log(error);
                  

                  writePostEntityResponse(newEntity);
                );

我看不出我做错了什么,错误消息虽然很清楚,但对我没有多大帮助。

【问题讨论】:

【参考方案1】:

通常当我收到该错误时,是因为我尝试保存一个不存在的字段,可能是因为我更改了表单或其他内容。

Mongo 自动创建 ObjectId。您是否尝试过删除该字段并查看会发生什么?

【讨论】:

谢谢约翰 - 你的第一句话:'...我试图保存一个不存在的字段'让我检查了我发送的数据,我注意到一个错字字段名称,修复后将所有内容整理出来! 真棒刘易斯!这是我第一次选择的答案。很高兴我能帮上忙!【参考方案2】:

顺序应该很重要。如果您在将架构附加到模型之前定义 models,那么您将处理正确的对象。

var schema = new Schema(...);
mongoose.model('ModelName', mySchema)
var models = 
    "foo": mongoose.model('ModelName')

var xyz = new models['foo']();
xyz.save();

关于报错信息,mongoose 在 build 中有一个验证系统,所以只要你保存它,它就会验证。默认情况下没有验证规则,所以它什么也不做。再次,您尝试保存的模型对象似乎缺少某些内容,可能是架构,也可能是验证代码。

【讨论】:

@Lewis 很容易忘记! 它就在那里,通过我更新的帖子,您可以看到我正在以一种不那么标准的方式访问模型!感谢您到目前为止的帮助:) @Lewis 顺序很重要,您应该在初始化 models 之前使用架构定义模型。 @Raynos - 不过我是,新架构 > mongoose.models(...) > 新模型(...) > xyz.save() :对吗? @Raynos。我相信这就是我正在做的事情。我将模型容器导出为模块并调用: var xyz = new models['foo'](); xyz.save();还有什么想法吗?

以上是关于使用 Mongoose.js 保存模型时,为啥会出现“无法调用未定义的 doValidate”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用?

用sqlplus连接数据库时,为啥会出Oracle not available错误?

MongoDB、Mongoose 和复合 _id

Node.js Mongoose.js 字符串到 ObjectId 函数

Node.js Mongoose.js 字符串到 ObjectId 函数

Node.js Mongoose.js 字符串到 ObjectId 函数