Как использовать шаблон репозитория и внедрение зависимостей в NodeJS? - PullRequest
0 голосов
/ 08 мая 2018

Я разработал систему с использованием Laravel, теперь я хочу перенести ту же систему на NodeJS. В Laravel я использовал шаблон хранилища ( эта библиотека ), поэтому у меня была такая схема:

router => controller => service => repository => (eloquent) модель

Что ж, я видел несколько библиотек ( awilix , sequelize ), которые могли бы помочь мне выполнить задачу, но у меня есть некоторые сомнения.

Я структурировал папки следующим образом:

/server.js
/lib/config
/lib/routes
/lib/controllers
/lib/models
/lib/services

Мне бы хотелось получить представление, если я нахожусь на правильном пути для создания огромного приложения (в системе будет более 100 объектов).

Другой вопрос, я не могу использовать Dependency Injection через awilix, поэтому я пробую что-то ручное, но каждый раз, когда я использую DepartmentController как класс, я получаю эту ошибку:

Route.get() requires a callback function but got a [object Undefined]

server.js

const express = require('express');
const app = express();
app.use(express.static(path.join(__dirname, 'public')));
const routes = require('./lib/routes/index'); // Rotas
app.use('/', routes);

Библиотека / Контроллеры / index.js

const departmentController = require('./DepartmentController');
module.exports = {
   departmentController
};

Библиотека / Контроллеры / DepartmentController.js

const Department = require('../models').Department;
const DepartmentService = require('../services/DepartmentService').DepartmentService;

module.exports = class DepartmentController {
  list(req, res) {
    return Department
      .all()
      .then(data => res.status(200).send(data))
      .catch(error => res.status(400).send(error));
  }
}

Библиотека / маршруты / index.js

const routes = require('express').Router();
const department_routes = require('./DepartmentRoute');
routes.use('/api', department_routes);
module.exports = routes;

Библиотека / маршруты / DepartmentRoute.js

const router = require('express').Router();
const departmentController = require('../controllers').departmentController;

router.route('/departments').get(departmentController.list);  
module.exports = router;

Библиотека / модель / Department.js

var Sequelize = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  var Department = sequelize.define('Department', 
  { 
    // sequelize options and database fields, working fine
  }
  return Department;
};

Библиотека / услуги / DepartmentService.js

const Department = require('../models').Department;

module.exports = class DepartmentService 
{
  constructor({ Department }) {
    this.departments = Department
  }

  findAll() {
    return this.departments.all();
  }
}
...