Как передать модель Mongoose? Пытаюсь сделать общий контроллер для моделей и для каждой добавлять новые возможности, но получаю несколько ошибок, причем не понимаю что делаю не так. Проверял как должна выглядеть нормальная модель, но когда передаю через конструктор получается что-то другое:Controller constructor function model(doc, fields, skipId) { model.hooks.execPreSync('createModel', doc); if (!(this instanceof model)) { return new model(doc, fields, skipId); } Model.call(this, doc, fields, skipId); } Когда чекаю ID то получаю еще одну ошибку:TypeError: Project.checkId is not a function Пример кода:const mongoose = require('mongoose'); const ProjectModel = require('../models/project'); class Controller { constructor(model) { console.log("Controller constructor", model); // ТУТ НЕ МОДЕЛЬ, А Controller constructor function model if (!model || !model.collection.name) { throw new Error(404, "Controller need mongoose model in constructor!"); } this.name = model.collection.name; this.model = model; } static checkId(id) { return mongoose.Types.ObjectId.isValid(id.toString()); } } class ProjectController extends Controller { constructor(name, model) { super(model) this.name = name; } static create(fields) { this.checkFields(fields); const newProject = new ProjectModel({ name: fields.name, description: fields.description, slides: [] }); return newProject.save(); } } module.exports = Project = new ProjectController('Project', ProjectModel);
Проблема здесь в том, что вы пытаетесь передать сам конструктор модели (ProjectModel), а не саму модель. Для передачи модели Mongoose вы можете ссылаться на сам объект модели, а не на сам конструктор модели.
Исправьте это следующим образом:
Вместо передачи конструктора модели (ProjectModel) в конструктор контроллера, передавайте сам объект модели (ProjectModel).Обновите конструктор контроллера соответственно.
Пример исправленного кода:
const mongoose = require('mongoose'); const ProjectModel = require('../models/project'); class Controller { constructor(model) { console.log("Controller constructor", model); if (!model || !model.collection.name) { throw new Error(404, "Controller needs a mongoose model in the constructor!"); } this.name = model.collection.name; this.model = model; } static checkId(id) { return mongoose.Types.ObjectId.isValid(id.toString()); } } class ProjectController extends Controller { constructor(name, model) { super(model) this.name = name; } static create(fields) { this.checkFields(fields); const newProject = new ProjectModel({ name: fields.name, description: fields.description, slides: [] }); return newProject.save(); } } module.exports = new ProjectController('Project', ProjectModel);
Теперь при создании экземпляра ProjectController передается объект модели ProjectModel, а не конструктор ProjectModel.
Проблема здесь в том, что вы пытаетесь передать сам конструктор модели (ProjectModel), а не саму модель. Для передачи модели Mongoose вы можете ссылаться на сам объект модели, а не на сам конструктор модели.
Исправьте это следующим образом:
Вместо передачи конструктора модели (ProjectModel) в конструктор контроллера, передавайте сам объект модели (ProjectModel).Обновите конструктор контроллера соответственно.Пример исправленного кода:
const mongoose = require('mongoose');const ProjectModel = require('../models/project');
class Controller {
constructor(model) {
console.log("Controller constructor", model);
if (!model || !model.collection.name) {
throw new Error(404, "Controller needs a mongoose model in the constructor!");
}
this.name = model.collection.name;
this.model = model;
}
static checkId(id) {
return mongoose.Types.ObjectId.isValid(id.toString());
}
}
class ProjectController extends Controller {
constructor(name, model) {
super(model)
this.name = name;
}
static create(fields) {
this.checkFields(fields);
const newProject = new ProjectModel({
name: fields.name,
description: fields.description,
slides: []
});
return newProject.save();
}
}
module.exports = new ProjectController('Project', ProjectModel);
Теперь при создании экземпляра ProjectController передается объект модели ProjectModel, а не конструктор ProjectModel.