【问题标题】: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);
                });

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

【问题讨论】:

    标签: javascript mongodb node.js mongoose


    【解决方案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();还有什么想法吗?
    猜你喜欢
    • 2013-09-06
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多