@quex

Пример использования Document#init в mongoose

Никак не могу понять как и с чем это съесть. В документации нет никакой четкой инфы по этому поводу (про сам метод вообще никакого упоминания в API документации)
Из комментария к этому методу в сорцах:
// Called internally after a document is returned from mongodb.

Метод используется на уровне документа (капитан очевидность), у документа есть атрибут isNew (вызов init кстати, устанавливает его в false), событие init можно обрабатывать через мидлвары
Таким образом, насколько я понимаю, при создании документа (экземпляра модели) должна происходить проверка существования такого документа в коллекции, и при положительном результате - инициализация документа.
предварительно добавляем в коллекцию документ {_id:1, title: "item123"}
далее выполняем
...
var schema = {_id: Number, title: String};
var itemSchema = mongoose.Schema(schema, {versionKey: false});
var itemModel = mongoose.model('items',itemSchema);

// попробуем вывести документ в консоль после инициализации
itemSchema.post('init', function(doc){
    console.log('post init function called');
    console.log(doc);
});

var item = new itemModel({_id:1});

после выполнения в консоли пусто, .init() не был вызван, поэтому и событие init не было сэмитировано. т.е. инициализации при создании документа не происходит. почему? объясните вообще принцип работы этого механизма. или мангуст просто предоставляет функционал, а разработчик уже сам решает когда и где в своих методах использовать .init(). Но тогда зачем в конструкторе модели Mongoose#Model() есть некий последний параметр skipInit (по умолчанию равный false), что наталкивает на мысль что этот механизм уже реализован.
  • Вопрос задан
  • 2621 просмотр
Пригласить эксперта
Ответы на вопрос 1
@quex Автор вопроса
после углубленного изучения и экспериментов, ответ нашелся. при создании документа конструкцией var item = itemsModel({..}) никакой инициализации не происходит, документ априори считается новым. метод .init() вызывается для результатов запроса (документов) при вызове Model.find, Model.findById, и т.д.
Таким образом, вся эта ерунда с инициализацией, атрибутами isNew, isInit, т.д. может оказаться полезной, например, в колбэках, когда один и тотже колбэк может применятся как на результаты выборки, так и на созданные документы через конструктор.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы