Как передать модель 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);

21 Авг 2019 в 06:59
170 +1
0
Ответы
1

Проблема здесь в том, что вы пытаетесь передать сам конструктор модели (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.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир