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

Are*_* Li 6 mongoose mongodb node.js express mongoose-schema

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

-- app.js
-- models
     |--db.js
     |--news.js
Run Code Online (Sandbox Code Playgroud)

其中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);
Run Code Online (Sandbox Code Playgroud)

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

但是,我遇到了许多脚本,它们不会导出在单独文件中定义的模型(或任何与此相关的内容),而仅通过要求模型文件和然后做这样的事情:

var mongoose = require('mongoose');
var News = mongoose.model('News');
Run Code Online (Sandbox Code Playgroud)

这怎么可能?这是猫鼬的特色吗?如果未在另一个文件中导出模型/模式,文件如何使用该文件中定义的模型或架构?

rob*_*lep 6

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

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

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

  • 嗨罗伯特!感谢你的回复!那么通过调用 `require('mongoose')` 返回的 `mongoose` 实例是一个单例吗?因此,一旦模型被注册,它就会成为 `mongoose` 单例的一部分。只要连接保持不变,从应用程序的任何脚本调用 `mongoose` 都会授予我访问定义模型的权限。那正确吗? (2认同)
  • @ArenLi 是的,它基本上是一个单例。这同样不适用于架构,仅适用于模型。我认为这是因为模式被视为“私有”:除了创建模型之外,它们没有用处(例如,一旦从模式创建了模型,就无法更改模型的模式)。 (2认同)