Как передать модель 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
149 +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 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир