2016-07-08 1 views
3

Рассмотрим очень простую структуру Экспресс 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'); 

Как такое поведение возможно? Это особенность Мангуста? Как файл может использовать модель или схему, определенные в другом файле, если эта модель/схема не экспортируется внутри этого файла?

ответ

3

Это в конечном счете работает, потому что, когда вы вызываете require('mongoose') в различные файлы, вы возвращаете тот же объект. Другими словами: он делится между app.js и news.js, в вашем случае.

Когда вы создаете новую модель (используя mongoose.Model('Name', schema)), Mongoose хранит экземпляр модели во внутреннем списке моделей.

Это также позволяет получить экземпляр по имени, используя mongoose.Model('Name'). Mongoose будет искать эту модель во внутреннем списке и возвращать ее.

+2

Привет, Роберт! Спасибо за ваш ответ! Итак, экземпляр 'mongoose', возвращенный вызовом' require ('mongoose') 'является синглом? Поэтому, как только модель зарегистрирована, она становится частью синглтона «mongoose». Пока соединение остается неизменным, вызов «mongoose» из любого скрипта приложения предоставит мне доступ к определенным моделям. Это правильно? –

+0

Теперь это имеет смысл. Однако такое же поведение распространяется и на схему? Если я определяю схему в одном скрипте и не экспортирую ее, будут ли другие скрипты, которые вызывают 'require ('mongoose')', иметь доступ к схеме? Или это поведение ограничено только моделями, но не схемой? –

+1

@ArenLi да, это в основном синглтон. То же самое не относится к схеме, только к моделям. Я думаю, это потому, что схема рассматривается как «частная»: они не нужны, кроме создания моделей (например, после создания модели из схемы вы не можете изменить схему для модели). – robertklep

Смежные вопросы