如果文件未导出,如何使用在单独文件中定义的猫鼬模型?
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.js
和news.js
之间共享。
当您创建一个新模型(使用mongoose.Model('Name', schema)
)时,Mongoose 将该模型实例存储在一个内部模型列表中。
这还允许您使用mongoose.Model('Name')
按名称获取实例。 Mongoose 将在其内部列表中查找该模型,并将其返回。
【讨论】:
嗨罗伯特!感谢你的回复!那么调用require('mongoose')
返回的mongoose
实例是单例吗?因此,一旦模型被注册,它就会成为mongoose
单例的一部分。只要连接保持不变,从应用程序的任何脚本调用mongoose
都会授予我对已定义模型的访问权限。对吗?
现在对我来说很有意义。但是,同样的行为是否也扩展到了 Schema?如果我在一个脚本中定义了一个模式并且不导出它,那么其他调用require('mongoose')
的脚本是否可以访问该模式?还是这种行为仅限于模型,而不是模式?
@ArenLi 是的,它基本上是一个单例。这同样不适用于模式,仅适用于模型。我认为这是因为模式被认为是“私有的”:除了创建模型之外,它们没有用(例如,一旦你从模式创建了模型,就不能更改模型的模式)。跨度>
以上是关于如果文件未导出,如何使用在单独文件中定义的猫鼬模型?的主要内容,如果未能解决你的问题,请参考以下文章