我正在尝试使用 Express 和 Mongoose 库创建一个可扩展的 RESTful 项目。
目前,我开发了一个 example in CodeSandbox我只有一个用户模型、一个用户存储库、一个用户 Controller 和一个用户路由。但如果我必须为多个模型重复所有 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);
当前用户 Controller
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;
然后我创建了一个默认 Controller ,它将逻辑函数添加到存储库:
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;
以及用户 Controller :
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”状态绑定(bind)到方法,您只需调整它或停止隐式调用它
看看区别
之前:
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)
)
关于javascript - Express + Mongoose Rest 可扩展项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59743203/