亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Node.js 中服務層的結構應該是什么

Node.js 中服務層的結構應該是什么

拉風的咖菲貓 2022-12-18 16:04:18
背景信息:我正在嘗試使用單獨的 Controller、Service 和 Dao 層來實現我的服務器。我不確定應該如何組織服務層模塊。例如,讓我們考慮一個UserService模塊,它是服務層模塊中的子模塊。但是,我不想創建單個UserService文件,而是將其分成單獨的文件,例如,一個FetchUsers類是用戶服務的一部分,并且將具有不同的獲取用戶的方法,filterBySomething(params)其中也包括一些業務邏輯,所以他們需要在服務層。如果我不將“UserService”劃分為單獨的模塊,那么單個模塊中的內容就會過多,并且也會違反 SRP。問題:我可以想到兩種實現此目的的方法,哪種更好?如果有比這兩種更好的方法,或者我不應該嘗試實現這一點,請提出替代方案。方法一:- services  - user    - index.js - directly exports modules inside user service    - FetchUser    - CreateUserThe index.js will do something like this:FetchUser = require('./FetchUser');module.exports = {  FetchUser: FetchUser}Controller will use it as:UserService.FetchUser.filterBySomething()方法二:- services  - user    - index.js - exports methods of individual modules, not the modules themselves    - FetchUser    - CreateUserThe index.js will do something like this:FetchUser = require('./FetchUser');module.exports = {  filterBySomething: FetchUser.filterBySomething}Controller will use it as:UserService.filterBySomething()方法 1 看起來它沒有足夠的封裝。方法 2 有很好的封裝,但它需要我在用戶服務中維護 index.js 每當我想從任何文件中添加/刪除任何內容時。
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

方法 2看起來不錯,因為封裝。


另一種可以節省大量時間的方法是在 index.js中自動導出

(對于任何服務,index.js 都是相同的,并且每次在同一目錄中更改/添加模塊并重新啟動時都會自我更新你的服務器)


我不是代碼優化專家,但這行得通


// 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


顯然,您應該在每個模塊中僅導出“公共”方法


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


查看完整回答
反對 回復 2022-12-18
  • 1 回答
  • 0 關注
  • 94 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號