javascript - Express + Mongoose Rest 可扩展项目

标签 javascript node.js rest express mongoose

我正在尝试使用 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。但也许我的整个观点是错误的,这不是可扩展应用程序的解决方案,或者它不应该针对这种大小进行扩展,如果是的话,我做错了什么?

This is the non-working Sandbox .

最佳答案

问题是您隐式调用 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/

相关文章:

javascript - 操作 module.exports 和 require

javascript - 访问并显示位于另一个组件中的模式

javascript - Angular 路由示例

Java uploader ( Jersey )使所有服务中断

rest - Dio options.contentType 与 header "Content-Type"

javascript - 是否存在一种方法来检查可观察对象是热的还是冷的?

node.js - 如何将 iBeacon 刷写/升级到 Eddystone?

node.js - 如何让不和谐机器人回答我的命令

javascript - 当某人以昵称 IRC 加入时

java - Camel REST DSL swagger 输出包含无效的 responseSchema 元素