Я пытаюсь создать масштабируемый проект 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
. Но, возможно, я ошибаюсь со всей своей точки зрения, и это не решение для масштабируемого приложения, или, может быть, оно не должно быть масштабируемым для этого размера, в случае, если это так, что я делаю неправильно?
Любой комментарий будет оценен.