猫鼬,我在哪里定义模型[关闭]

Posted

技术标签:

【中文标题】猫鼬,我在哪里定义模型[关闭]【英文标题】:Mongoose, where do I define the model [closed] 【发布时间】:2014-02-11 19:54:26 【问题描述】:

我正在构建我的第一个 node/express/mongoose 应用程序。我被这个错误困住了:

500 ReferenceError: ServerModel 未定义

下面是文件“routes/input.js”。我不知道我做错了什么,模型在我尝试使用它之前就已经明确定义了。

exports.verify = function(req, res)
var mongoose = require('mongoose');

var serverSchema = new mongoose.Schema(
  name:  type: String, unique: true ,
  os: String,
  osVersion: String,
  createdOn: type: Date, default: Date.now ,
  modifiedOn: Date,
  cores: Number,
  memoryGB: Number,
  licenses: [licenseSchema]
);
var licenseSchema = new mongoose.Schema(
  name: String,
  createdOn: type: Date, default: Date.now ,
  modifiedOn: Date
);

mongoose.model( 'ServerModel', serverSchema );

  var inputVar = new ServerModel(
    name: req.param.name,
    os: req.param.OS,
    osVersion: req.param.OSv
  );
  res.render('input',  title: 'verify' );
;

【问题讨论】:

我现在可以使用该模型,但我仍然有问题。 OverwriteModelError: 编译后无法覆盖Server 模型。我想我明白为什么,因为每次调用路由时,它都会尝试再次定义模型。我需要在其他地方定义模型......但我不确定在哪里。 我认为这个问题令人厌恶,我想删除,因为我认为我的问题没有得到回答,而且它只是占用了 Internet 上的空间。 那就删掉吧。我在这个答案上花了很多时间(甚至给你做了一个吓人的 gif),所以我想如果你要说这不是一个实际的答案,那么无论如何;也许你应该问更好的问题。祝你好运。 我不久前尝试删除它,但它不会让我这样做。当我试图改写这个问题并且它被修改时,我很生气。你没有回答我的问题。我很感激您花费了多少时间来回答它,但您所做的是使用您创建的东西提出解决方案。这很好,但这不是我要求的。 只要弹出索引文件,你就会看到它有多薄。您正在询问将 mongoose 资源放在哪里,而 simpledb 所做的就是这样做,为您提供了一个很好的模式来遵循。说真的,偷看the module code。 【参考方案1】:

你需要说:

var ServerModel = mongoose.model( 'ServerModel', serverSchema );

【讨论】:

是的,现在可以使用了,谢谢。我一直在阅读的这本书以我最初在示例中的方式显示了它。也许这本书已经过时了?现在一切正常,我可以从 mongo CLI 看到数据库内部的数据,但它只工作了 1 次。如果我尝试重新加载页面,它会给我这个错误。 OverwriteModelError: 编译后无法覆盖ServerModel 模型。如果我重新启动应用程序,我可以使用它向数据库添加 1 个条目,然后必须再次重新启动它。 如果对你有帮助,别忘了把答案标记为正确:) 我不得不取消“正确”状态,因为我仍然不知道在哪里定义模型。我在错误的地方调用它,目前每次有人加载页面时都会定义它,这给了我错误。 @Daniel Flippance 纠正了我如何定义它,而不是在哪里。谢谢 如果每个请求都发生这种情况,那么您就是在某处的请求处理程序中定义模型。理想情况下,您应该在执行其余的应用程序初始化代码之前定义您的模型并准备好 mongoose。如果您想要一个模块,它可以为您提供定义模型的特定位置和插入应用程序逻辑的特定位置,请参阅我的答案。【参考方案2】:

您刚刚开始的另一个答案:mongoose-simpledb。

免责声明:我写的。

导致上面 gif 中名称字段没有显示在末尾的故障实际上是​​用户错误。在测试期间,我插入了一条具有相同用户名的相同记录,但它没有名称字段。用户的最终检索实际上是检索该用户而不是第二个用户:/

它让您可以在应用程序根目录(或您在选项中指定的任何文件夹)的“dbmodels”文件夹中的单独文件中定义所有模式。示例模型/模式文件如下所示:

// /dbmodels/Book.js

exports.schema = 
    title: String,
    publishDate: Date,
    authorName: 
        first: String
        last: String
    
;

请注意,它与 mongoose 想要的架构对象完全相同。您还可以在模型文件中定义方法和虚拟属性。下面是一个示例虚拟属性,即使数据库中存储的文档中没有这样的属性,您也可以获取和设置 authorName.full 属性:

// /dbmodels/Book.js continued...

exports.virtuals = 
    'authorName.full': 
        get: function () 
            return this.authorName.first + ' ' + this.authorName.last;
        ,
        set: function (fullName) 
            if (fullName.indexOf(' ') !== -1) 
                var names = fullName.split(' ');
                this.authorName.first = names[0];
                this.authorName.last = names[1];
             else 
                this.authorName.first = fullName;
                this.authorName.last = '';
            
        
    
;

设置好模型文件后,您希望它们如何初始化您的数据库非常简单。

// app.js

var simpledb = require('mongoose-simpledb');

simpledb.init('mongodb://localhost/test', function (err, db) 
    if (err) return console.error(err);
    // Now you can access your models via the db object. Example:
    db.Book.find( title: "Pale Blue Dot" , function (err, books) 
        // ...
    );
    // This is a great place to put your application code, such as an
    // express app and then pass the db object wherever you need it :)
);

我编写此模块是为了更轻松地使用 Mongoose 完成 98% 的用例。最终,您只需要一个包含所有模型的对象,这样您就可以将其用作数据层的 API。这个模块完成了所有这些。您只需要传递您的连接字符串就可以了。但是,您也可以传入一个选项对象来代替连接字符串并配置某些内容以满足您的需求(请参阅README)。

如果有帮助的话,我最近还整理了一个Node.js & MongoDB 101 视频(未获利):)

【讨论】:

你是说没有你的模块(或另一个模块)就不可能在不同的路线上重用相同的模型吗?因为我无法在 2 条路线上使用相同的模型。 当然你可以在多条路线上使用同一个模型。我的模块所做的只是通过为您提供一个附加了所有模型的 db 对象,从而使事情变得更加简单。没有我的模块,你绝对可以做我所做的一切; simpledb 只是提供了一个简单的结构,因此更容易设置。在我的示例中,您可以通过 db 对象获取您的模型,并且您可以在任何您想要的地方访问该对象。查看the readme。 @AlexFord 为什么我会收到与mongoose-simpledb 类似的错误?我以前用过没有问题。但是我有一个相对较新的项目,只有一个模型,我得到了这个:i.imgur.com/Xu3H8ah.png 任何想法可能有什么问题? @Antrikshy 听起来你可能会多次初始化 simpledb?确保 simpledb.init 仅在您的应用启动时被调用一次。 感谢您的帮助!当我可以使用正常运行的计算机时,我会发布更多详细信息。硬盘问题... -_-

以上是关于猫鼬,我在哪里定义模型[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬模型在填充后获得未定义的属性

猫鼬模型测试需要模型

如果文件未导出,如何使用在单独文件中定义的猫鼬模型?

在猫鼬中发布嵌套模型

保存时使用字符串作为猫鼬模型的自定义 ID

猫鼬中的用户、帖子和评论模型