Express + Пн goose Отдых масштабируемый проект - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь создать масштабируемый проект RESTful, используя библиотеки Express и Mon goose.

На данный момент я разработал пример в CodeSandbox , где у меня есть только пользователь модель, хранилище пользователя, контроллер пользователя и маршрут пользователя. Но если мне придется повторить все операции CRUD для более чем одной модели, я думаю, что мне придется избегать повторного написания кода для каждой модели.

Это мой текущий код:

Текущий пользователь модель

const mongoose = require("mongoose");
const bcrypt = require("mongoose-bcrypt");

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  password: {
    type: String,
    bcrypt: true
  }
});

userSchema.plugin(bcrypt);

module.exports = mongoose.model("User", userSchema);

Текущий пользовательский репозиторий

const User = require("../models/User");

class UserRepository {
  constructor(model) {
    this.model = model;
  }

  create(object) {
    return this.model.create(object);
  }

  get() {
    return this.model.find().exec();
  }
}

module.exports = new UserRepository(User);

Текущий пользовательский контроллер

const UserRepository = require("../repositories/user");

function createUser(req, res) {
  const user = req.body;

  UserRepository.create(user)
    .then(response => res.json(response))
    .catch(err => res.status(500).json(err));
}

function getUsers(req, res) {
  UserRepository.get()
    .then(response => res.json(response))
    .catch(err => res.status(500).json(err));
}

module.exports = { createUser, getUsers };

Текущий пользовательский маршрут

const express = require("express");
const UserController = require("../controllers/users");

const router = express.Router();

router.get("/", UserController.getUsers);
router.post("/", UserController.createUser);

module.exports = router;

I Я думаю, что мне нужно «создать» решение agnosti c для каждой модели, в которой меняется только одно.


Итак, я создал Репозиторий по умолчанию со следующим code:

class DefaultRepository {
  constructor(model) {
    this.model = model;
  }

  create(object) {
    return this.model.create(object);
  }

  get() {
    return this.model.find().exec();
  }
}

module.exports = DefaultRepository;

Затем я добавил код в свой репозиторий пользователей :

class DefaultRepository {
  constructor(model) {
    this.model = model;
  }

  create(object) {
    return this.model.create(object);
  }

  get() {
    return this.model.find().exec();
  }
}

module.exports = DefaultRepository;

Затем я создал контроллер по умолчанию , который будет добавьте функцию logi c в репозитории:

class DefaultController {
  constructor(repository) {
    console.log(this);
    this.repository = repository;
  }

  create(req, res) {
    const user = req.body;

    this.repository
      .create(user)
      .then(response => res.json(response))
      .catch(err => res.status(500).json(err));
  }

  get(req, res) {
    this.repository
      .get()
      .then(response => res.json(response))
      .catch(err => res.status(500).json(err));
  }
}

module.exports = DefaultController;

и пользовательский контроллер :

const UserRepository = require("../repositories/user");
const DefaultController = require("./default");

class UserController extends DefaultController {
  // additional logic
}

module.exports = new UserController(UserRepository);

И наконец я добавил это к Маршрут пользователя :

const express = require("express");
const UserController = require("../controllers/users");

const router = express.Router();

router.get("/", UserController.get);
router.post("/", UserController.create);

module.exports = router;

Но, конечно, это не работает, как ожидалось. На самом деле это не работает вообще. Я получаю TypeError: Cannot read property 'repository' of undefined. Но, возможно, я ошибаюсь со всей своей точки зрения, и это не решение для масштабируемого приложения, или, может быть, оно не должно быть масштабируемым для этого размера, в случае, если это так, что я делаю неправильно?

Это нерабочая песочница

Любой комментарий будет оценен.

1 Ответ

1 голос
/ 15 января 2020

Проблема в том, что вы вызываете методы User. * Неявно, что не связывает состояние «this» с методами, вам просто нужно адаптировать его или прекратить вызывать его неявно

Смотрите разницу

До:

router.get("/", UserController.get);
router.post("/", UserController.create); 

После:

router.get("/", UserController.get.bind(UserController)); 
router.post("/", UserController.create.bind(UserController))); 

Или вы называете это как это

router.get("/", (req, res, next) =>
    UserController.get(req, res)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...