快递+猫鼬休息可扩展项目



我正在尝试使用Express和Mongoose库制作一个可扩展的RESTful项目。

现在,我在 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;

我认为我需要为每个模型"创建"一个不可知的解决方案,这是唯一正在改变的东西。


所以我使用以下代码创建了一个默认存储库

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;

然后,我创建了一个默认控制器,它将逻辑函数添加到存储库:

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.但也许我的整个观点是错误的,这不是可扩展应用程序的解决方案,或者它不应该针对这种大小进行扩展,万一是这样,我做错了什么?

这是不工作的沙盒。

问题是你正在隐式调用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)
)

最新更新