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

Posted

技术标签:

【中文标题】如果文件未导出,如何使用在单独文件中定义的猫鼬模型?【英文标题】:How to use a mongoose model defined in a separate file if the file is not exported? 【发布时间】:2016-11-11 12:20:01 【问题描述】:

考虑一个非常简单的 Express 4 应用程序结构:

-- app.js
-- models
     |--db.js
     |--news.js

其中news.js 包含一个猫鼬模式和一个基于该模式的模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var newsSchema = new Schema(
    title: String,
    subtitle: String,
    // other fields...
);

var News = mongoose.model('News', newsSchema);

据我了解,为了让app.js 使用News 模型,它必须要求脚本中的文件如下:require('./models/news')。此外,news.js 必须像这样导出模型:module.exports = News;

但是,我遇到了一些脚本,它们不会导出在单独文件中定义的模型(或任何相关内容),但仍然能够在不同文件中使用这些模型和/或架构,只需要求模型文件,然后做这样的事情:

var mongoose = require('mongoose');
var News = mongoose.model('News');

这种行为怎么可能?这是猫鼬的一个特殊功能?如果模型/架构未在该文件中导出,文件如何使用该文件中定义的模型或架构?

【问题讨论】:

【参考方案1】:

这最终会起作用,因为当您在各种文件中调用 require('mongoose') 时,您会返回相同的对象。换句话说:在您的情况下,它在app.jsnews.js 之间共享。

当您创建一个新模型(使用mongoose.Model('Name', schema))时,Mongoose 将该模型实例存储在一个内部模型列表中。

这还允许您使用mongoose.Model('Name') 按名称获取实例。 Mongoose 将在其内部列表中查找该模型,并将其返回。

【讨论】:

嗨罗伯特!感谢你的回复!那么调用require('mongoose')返回的mongoose实例是单例吗?因此,一旦模型被注册,它就会成为mongoose 单例的一部分。只要连接保持不变,从应用程序的任何脚本调用mongoose 都会授予我对已定义模型的访问权限。对吗? 现在对我来说很有意义。但是,同样的行为是否也扩展到了 Schema?如果我在一个脚本中定义了一个模式并且不导出它,那么其他调用require('mongoose') 的脚本是否可以访问该模式?还是这种行为仅限于模型,而不是模式? @ArenLi 是的,它基本上是一个单例。这同样不适用于模式,仅适用于模型。我认为这是因为模式被认为是“私有的”:除了创建模型之外,它们没有用(例如,一旦你从模式创建了模型,就不能更改模型的模式)。跨度>

以上是关于如果文件未导出,如何使用在单独文件中定义的猫鼬模型?的主要内容,如果未能解决你的问题,请参考以下文章

跨多个模型导出和重用我的猫鼬连接

要导出以编辑表单的猫鼬日期值

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

如何将数据从猫鼬模型显示/渲染到 ejs 文件

NestJS如何在单元测试中创建新的猫鼬模型?

用于续集模型的猫鼬模式