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

How to use a mongoose model defined in a separate file if the file is not exported?

考虑一个非常简单的 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;.

但是,我遇到过许多脚本,这些脚本不导出在单独文件中定义的模型(或任何与此相关的内容),但仍然能够在不同文件中使用这些模型 and/or 模式只需要求模型文件,然后执行如下操作:

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

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

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

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

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