Какой должна быть структура сервисного слоя в Node.js - PullRequest
0 голосов
/ 02 августа 2020

Справочная информация: Я пытаюсь реализовать свой сервер с отдельными уровнями Controller, Service и Dao. Я не уверен, как должен быть организован модуль уровня сервиса.

Например, давайте рассмотрим модуль UserService, который является подмодулем в модуле уровня сервиса. Однако я не хочу создавать один файл UserService, а скорее разделяю его на отдельные файлы, например, класс FetchUsers, который является частью службы User и будет иметь разные методы для выборки пользователей, например filterBySomething(params) который также будет включать некоторые бизнес-логи c, поэтому они должны быть на уровне обслуживания.

Если я не разделю UserService на отдельные модули, в один, и это также нарушит SRP.

Вопрос: Я могу придумать два способа достижения этого, какой из них лучше? Если есть способы лучше, чем эти два, или мне не следует пытаться достичь этого, предложите альтернативы.

Метод 1:

- services
  - user
    - index.js - directly exports modules inside user service
    - FetchUser
    - CreateUser

The index.js will do something like this:
FetchUser = require('./FetchUser');
module.exports = {
  FetchUser: FetchUser
}

Controller will use it as:
UserService.FetchUser.filterBySomething()

Метод 2:

- services
  - user
    - index.js - exports methods of individual modules, not the modules themselves
    - FetchUser
    - CreateUser

The index.js will do something like this:
FetchUser = require('./FetchUser');
module.exports = {
  filterBySomething: FetchUser.filterBySomething
}

Controller will use it as:
UserService.filterBySomething()

Метод 1 выглядит так, как будто в нем недостаточно инкапсуляции. Метод 2 имеет хорошую инкапсуляцию, но требует от меня поддержки индекса. js внутри пользовательской службы всякий раз, когда я хочу добавить / удалить что-либо из любого файла.

1 Ответ

0 голосов
/ 02 августа 2020

метод 2 кажется хорошим, как вы говорите, из-за инкапсуляции.

Другой метод, который может сэкономить вам много времени, - автоматизировать экспорт в индекс . js (который будет одним и тем же индексом. js для любой службы и будет автоматически обновляться каждый раз, когда вы меняете / добавляете модуль в тот же каталог и перезапускаете сервер)

I ' m не специалист по оптимизации кода, но это работает

// index.js (for ALL services)
const fs = require('fs')
const path = require('path')

let fileNames = fs.readdirSync('.')
// use Sync to not create Async errors elsewere
  .filter(name => name.endsWith('.js') && name !== __filename)
  // only get js files and exclude this file
  .map(name => './' + path.relative(__dirname, name))
  // get relative paths

let methods = {}
// the future export of this file

fileNames.forEach(file => {
  try {
    let fileModule = require(file) 
    // try to require the module
    Object.keys(fileModule).forEach(method => {
    // for each method/key of the module
      methods[method] = fileModule[method]
      // add this method to the exports of this file (methods)
    })
  } catch (err) {
    console.log('WARNING:\n' + err.message)
    // probably couldn't require the module
  }
})

module.exports = methods
// you export all the exported methods
// of all the js files of the same directory

Очевидно, вам следует экспортировать только методы publi c в каждый из ваших модулей

class FetchUser {
  static filterBySomething (arg) {
    // do your magik
  }
  static method2 (arg) {
    // another method
  }
}

module.exports = FetchUser
// this will make ALL methods of class FetchUser accessible in index

module.exports = {
  filterBySomething: FetchUser.filterBySomething
}
// if you want other methods like method2 to NOT be exported

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...